Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > C++ > Re: STL objects...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 19 of 24 Topic 45764 of 47032
Post > Topic >>

Re: STL objects and binary compatibility

by Paavo Helde <nobody@[EMAIL PROTECTED] > May 13, 2008 at 12:27 PM

James Kanze <james.kanze@[EMAIL PROTECTED]
> wrote in news:b1725b32-e4b6-43d1-
8be1-33277dd1279a@[EMAIL PROTECTED]
> On May 13, 1:35 am, Paavo Helde <nob...@[EMAIL PROTECTED]
> wrote:
>> James Kanze <james.ka...@[EMAIL PROTECTED]
> wrote
>> innews:af6d7bb2-944e-4e8d-87eb-a74731b9f7ad@[EMAIL PROTECTED]
> 
>> > On 12 mai, 08:15, Paavo Helde <nob...@[EMAIL PROTECTED]
> wrote:
> 
>> >     [concerning the _SECURE_SCL option in VC++...]
> 
[...]
>> VC++ on XP crashes the application with the message "test.exe
>> has encountered a problem and needs to close.  We are sorry
>> for the inconvenience.". If _SECURE_SCL is defined to 0, the
>> program runs nicely and produces the expected results.
> 
> By shear chance, maybe.  It's definitly something that you
> shouldn't be doing.
> 
>> Example 2:
> 
>> #include <vector>
>> #include <iostream>
>> #include <ostream>
> 
>> double summate(const double* arr, size_t n) {
>>         double sum=0.0;
>>         for(size_t i=0; i<n; ++i) {
>>                 sum += arr[i];
>>         }
>>         return sum;
>> }
> 
>> int main() {
>>         std::vector<double> v;
>>         // ...
>>         std::cout << summate(&v[0], v.size()) << "\n";
>> }
> 
>> This fails in the similar fa****on, but only on an im****tant
>> customer demo, where the size of array happens to be zero.
> 
> And?  It's undefined behavior, and there's no reason to expect
> it to work.
> 
>> It appears that VC++ is warning me against potential problems
>> which might happen on exotic hardware (or on common hardware
>> in exotic modes), but does this on the most unpleasant way,
>> cra****ng on run-time the application which would have run
>> nicely otherwise.
> 
> Or not.  It certainly wasn't guaranteed to run nicely.

Programming is kind of engineering. In engineering you have to make 
trade-offs in order to achieve your goals. Here, in this case I have a 
large application which may contain UB similar to above cases. I have 
tried hard to find and fix all UB, but one never can be sure. The UB of 
the above sort does arise only if the size of vector is zero, which 
usually does not happen. The code is complex and I'm not sure all corner 
cases are correctly covered by unit tests. In other words, I believe that 
the code is correct, but I am not 100% sure. 

Now I have to deliver the final application (Release mode) to the 
customer. The question is whether to keep the checked iterators feature 
on or not. I have the following choices:

a) Keep the checked iterators on: this makes the program somewhat slower, 
and if a corner case of this UB is encountered, the probability of a 
customer sup****t problem appearing is 100%. 

b) Switch them off: the code is faster, and if this corner case of UB is 
encountered, the probability to have a customer sup****t problem is below 
100% (0% by empiric evidence, but I will not stress that). The 
probability of producing slightly wrong results is somewhat higher than 
0, but also close to zero by my estimation, as the operation involved in 
UB case most probably does not write anything to memory.

Of course, the decision also depends on the application domain. In a 
safety-critical work you cannot live on probabilities. In our case my 
favorite is clearly b).

> 
>> Cite fromhttp://msdn.microsoft.com/en-us/library/aa985965.aspx
>>
>> "Checked iterators apply to release builds and debug builds.
>> ...
> 
> Maybe, but I manage to turn them off or on at will.  (I
> currently have them turned on in both release and debug builds,
> at least at present, but I rather suspect that I'll change this
> policy in the long.  Basically, I use a common build for both
> release and debug, and offer an "optimized" build for the
> special cases where performance is an issue.  And it does make
> sense to turn them off in the optimized build.)

Of course they can be turned off. In an earlier message in this thread 
you said: "Any code which does anything with them
(_GLIBCXX_DEBUG and _SECURE_SCL) is invoking undefined behavior." Or do 
you want to claim it is not UB if specified on command-line?

> 
>> The default value for _SECURE_SCL is 1, meaning checked
>> iterators are enabled by default."
> 
> The default value is only used if _SECURE_SCL hasn't been
> previously defined.  If I invoke VC++ with -D_SECURE_SCL=0,
> there's no checking.
> 

Yep, that's what the word "default" means.

[...]
>> And no, this is not simpler. For starters, VC++ wizards
>> generate code (can be deleted of course) to redefine the "new"
>> keyword in Debug builds, which would cause link errors when
>> attempting to link to the Release-build run-time library.
> 
> In other words, no one in his right mind uses the wizards.
> Because the last thing you want is funny things happening with
> your keywords.

Agreed.

>> All modules exchanging dynamically allocated objects should
>> better be linked to the same run-time library - if the choice
>> is not the default one it is very hard to achieve. And by
>> abandoning the debug library one abandons also the debugging
>> features it offers.
> 
> But all objects will be linked to the same run-time library,
> since you only link once.  I think you're confusing issues

I have about 20-30 different DLL-s, which are all first linked once when 
they are built, and loaded in the running application dynamically when 
needed, thus completing the linking process. Different DLL-s may well 
happen to be linked to different runtime libraries (as is the case for 
static libs as well, but this can be controlled much better).

> somewhat: what you mean, I think, is that all of the modules
> must be compiled with the same options (at least with regards to
> those which can affect binary compatibility), and that the
> application must then be linked with a run-time library which
> was also compiled with those options.

Yes, that's easy, but this goes only for a single DLL. 

> 
>> Compared with the simplicity and flexibility of the Linux/ELF
>> dynamic linking process (cf. libefence) it's a shame. I know
>> your answer - use static linking and monolithic applications.
>> Unfortunately this is not always an option.
> 
> Not always, I know.  And when it's not, I've run into exactly
> the same problem under Linux, with g++.  For that matter, I've
> run into it when statically linking as well---the problem is
> really independent of whether you link statically or
> dynamically.  If sizeof( std::vector<double> ) is 12 in the
> calling function, and 28 in the library routine which receives a
> reference to it, problems will ensue.

Right.

> At any rate, I've just verified: /D_SECURE_SCL=0 in the command
> line does the trick.  But you very definitely must be sure that
> all of the code using your library is compiled with this option.
> If you're selling a library to outside customers, this could be
> considered a very constraining requirement.
> 

We are selling a complete application containing many libraries. In 
principle the customer can develop and add their own libraries. OTOH, 
they can also create custom applications using our libraries. Yes, it 
might be appropriate to offer different versions. However, as you can see 
we have hard times sometimes even to get the single version consistent...

Regards
Paavo
 




 24 Posts in Topic:
STL objects and binary compatibility
osama178@[EMAIL PROTECTED  2008-05-05 20:40:22 
Re: STL objects and binary compatibility
Gianni Mariani <gi4nos  2008-05-06 05:56:23 
Re: STL objects and binary compatibility
James Kanze <james.kan  2008-05-06 02:52:52 
Re: STL objects and binary compatibility
osama178@[EMAIL PROTECTED  2008-05-06 10:29:14 
Re: STL objects and binary compatibility
Gianni Mariani <gi4nos  2008-05-06 19:10:54 
Re: STL objects and binary compatibility
Ian Collins <ian-news@  2008-05-07 07:34:57 
Re: STL objects and binary compatibility
Joe Greer <jgreer@[EMA  2008-05-07 15:12:14 
Re: STL objects and binary compatibility
James Kanze <james.kan  2008-05-07 02:08:24 
Re: STL objects and binary compatibility
Paavo Helde <nobody@[E  2008-05-08 16:08:06 
Re: STL objects and binary compatibility
osama178@[EMAIL PROTECTED  2008-05-07 14:23:58 
Re: STL objects and binary compatibility
Joe Greer <jgreer@[EMA  2008-05-08 17:02:15 
Re: STL objects and binary compatibility
James Kanze <james.kan  2008-05-09 05:20:59 
Re: STL objects and binary compatibility
Paavo Helde <nobody@[E  2008-05-12 01:15:39 
Re: STL objects and binary compatibility
James Kanze <james.kan  2008-05-12 02:57:18 
Re: STL objects and binary compatibility
Paavo Helde <nobody@[E  2008-05-12 18:35:10 
Re: STL objects and binary compatibility
Triple-DES <DenPlettfr  2008-05-12 22:36:30 
Re: STL objects and binary compatibility
Paavo Helde <nobody@[E  2008-05-13 03:10:55 
Re: STL objects and binary compatibility
James Kanze <james.kan  2008-05-13 03:20:37 
Re: STL objects and binary compatibility
Paavo Helde <nobody@[E  2008-05-13 12:27:43 
Re: STL objects and binary compatibility
"kwikius" <a  2008-05-13 20:19:35 
Re: STL objects and binary compatibility
ajalkane <ajalkane@[EM  2008-05-13 21:57:04 
Re: STL objects and binary compatibility
Ian Collins <ian-news@  2008-05-14 17:34:59 
Re: STL objects and binary compatibility
James Kanze <james.kan  2008-05-14 02:04:10 
Re: STL objects and binary compatibility
James Kanze <james.kan  2008-05-14 02:13:27 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Fri Jul 25 15:55:27 CDT 2008.