Opened 11 years ago

Closed 7 years ago

#6766 closed Bugs (fixed)

incorrect declaration for putenv in config.hpp

Reported by: stephen.clamage@… Owned by: Raffi Enficiaud
Milestone: Boost 1.59.0 Component: test
Version: Boost 1.49.0 Severity: Problem
Keywords: Cc:

Description

File boost/test/utils/runtime/config.hpp at lines 47-49 has

#ifdef __SUNPRO_CC
extern int putenv(char *);
#endif

The immediate problem is that the function is declared as extern "C" on Solaris, which causes a conflict in BOOST components that include <stdlib.h>. A quick fix would be make this declaration extern "C", but IMHO that is not the best fix. It addresses the problem only in testing BOOST, not necessarily in using BOOST.

Oracle C++ (SUNPRO_CC) compilers support Linux in addition to Solaris, and follow the C++ standard regarding standard headers. Only declarations that are part of standard C or C++ appear in the <cxxx> headers. Additional declarations appear in the <xxx.h> headers, depending on the platform, since most platforms specify additional declarations for the C headers.

For the case in point, <cstdlib> does not contain a declaration for putenv, but <stdlib.h> does, because POSIX specifies putenv as part <stdlib.h>.

My guess is that some BOOST component(s) included <cstdlib> and expected to find putenv there -- a non-portable assumption. Somebody tried to fix the problem by adding a declaration to config.hpp, but got the declaration wrong.

I recommend removing this hack from config.hpp, and fixing any tests that fail by including <stdlib.h> instead of <cstdlib>. That is, if you want a POSIX function, you should include a POSIX header.

After removing the lines, the only failure I have found in BOOST 1.49 is libs/test/src/unit_test_parameters.cpp

Change History (10)

comment:1 by Gennadiy Rozental, 10 years ago

Owner: changed from Gennadiy Rozental to Steven Watanabe

Steven,

This was your addition. I do not have access to this platform anymore. Do you mind looking into this?

comment:2 by Aparna Kumta <aparna.kumta@…>, 8 years ago

I see this failure in my Nightly regression testing in the develop branch when compiling libs/test/src/unit_test_parameters.cpp

"/usr/include/stdlib.h", line 113: Error: putenv(char*) was declared before with a different language. 1 Error(s) detected.

This seems to prevent building of libboost_unit_test_framework.a

...skipped <p/export/users/akumta/BOOST_REGRESSION_patch_local/results/boost/bin.v2/libs/test/build/sun-stlport4/release/link-static/threading-multi>libboost_unit_test_framework.a for lack of <p/export/users/akumta/BOOST_REGRESSION_patch_local/results/boost/bin.v2/libs/test/build/sun-stlport4/release/link-static/threading-multi>unit_test_parameters.o...

Any idea when this fix could go in?

Thank you.

comment:2 by Aparna Kumta <aparna.kumta@…>, 8 years ago

I see this failure in my Nightly regression testing in the develop branch when compiling libs/test/src/unit_test_parameters.cpp

"/usr/include/stdlib.h", line 113: Error: putenv(char*) was declared before with a different language. 1 Error(s) detected.

This seems to prevent building of libboost_unit_test_framework.a

...skipped <p/export/users/akumta/BOOST_REGRESSION_patch_local/results/boost/bin.v2/libs/test/build/sun-stlport4/release/link-static/threading-multi>libboost_unit_test_framework.a for lack of <p/export/users/akumta/BOOST_REGRESSION_patch_local/results/boost/bin.v2/libs/test/build/sun-stlport4/release/link-static/threading-multi>unit_test_parameters.o...

Any idea when this fix could go in?

Thank you.

comment:3 by Raffi Enficiaud, 8 years ago

The best would be to know which version of the SUNPRO_CC compiler the

extern "C" void putenv

is needed and change this as a workaround for version of the compiler earlier than this one.

The problem is: no one has a Sun here.

Digging a bit more: I can see a similar commit in rev cd47d62b4677b003a75885db5d08d50a1a586bf6 for the execution_monitor.hpp. So why not just having that in the config file?

What version of the compiler do you have right now?

comment:4 by Steven Watanabe, 8 years ago

I suspect that #include <stdlib.h> was the correct fix even when I put the workaround in originally. If I remember correctly I was running Solaris 10, Sun CC 5.9.

comment:5 by Raffi Enficiaud, 8 years ago

Thanks. I am in favor of removing the hack and including the stdlib.

comment:6 by Raffi Enficiaud, 8 years ago

Owner: changed from Steven Watanabe to Raffi Enficiaud
Status: newassigned

Tentative fix branch tractickets/6766-incorrect-declaration-for-putenv-in-config.hpp, commit 17bef37 (see PR #36)

Waiting for feedback before merging.

comment:7 by Aparna Kumta <aparna.kumta@…>, 8 years ago

Branch tractickets/6766-incorrect-declaration-for-putenv-in- config.hpp, commit 17bef37 has been tested with Oracle Solaris Studio compiler and the fix looks good.

This ticket prevents building of libboost_unit_test_framework.a. As a result many tests (from accumulators, algorithm, assign, lexical_cast, msm, odeint, polygon, range and sync) fail due to a dependency on libboost_unit_test_framework.a. The fix significantly improves the pass rate of the test runs by 15% .

We would highly appreciate it if the fix can be putback to develop/master so it can make 1.58 release.

comment:8 by Raffi Enficiaud, 8 years ago

Will be in develop soon, thanks for your patience.

comment:9 by Raffi Enficiaud, 7 years ago

Milestone: To Be DeterminedBoost 1.59.0
Resolution: fixed
Status: assignedclosed
Note: See TracTickets for help on using tickets.