Liste des Groupes | Revenir à cl c |
On 2024-03-21, Keith Thompson <Keith.S.Thompson+u@gmail.com> wrote:The C standards don't define a term "externally visible". They define "observable behaviour", and require that a conforming implementation generates a program that matches the "observable behaviour". This is in 5.1.2.2.2p6. Interaction between translation units is not part of the observable behaviour of a program, because it is not relevant to the concept of /running/ a program - it is only relevant when translating the source to the program image.Kaz Kylheku <433-929-6894@kylheku.com> writes:It always does; the interaction of a translation unit with anotherOn 2024-03-21, David Brown <david.brown@hesbynett.no> wrote:[...]On 20/03/2024 19:54, Kaz Kylheku wrote:>On 2024-03-20, Stefan Ram <ram@zedat.fu-berlin.de> wrote:>A "famous security bug":>
>
void f( void )
{ char buffer[ MAX ];
/* . . . */
memset( buffer, 0, sizeof( buffer )); }
>
. Can you see what the bug is?
I don't know about "the bug", but conditions can be identified under
which that would have a problem executing, like MAX being in excess
of available automatic storage.
>
If the /*...*/ comment represents the elision of some security sensitive
code, where the memset is intended to obliterate secret information,
of course, that obliteration is not required to work.
>
After the memset, the buffer has no next use, so the all the assignments
performed by memset to the bytes of buffer are dead assignments that can
be elided.
>
To securely clear memory, you have to use a function for that purpose
that is not susceptible to optimization.
>
If you're not doing anything stupid, like link time optimization, an
external function in another translation unit (a function that the
compiler doesn't recognize as being an alias or wrapper for memset)
ought to suffice.
Using LTO is not "stupid". Relying on people /not/ using LTO, or not
using other valid optimisations, is "stupid".
LTO is a nonconforming optimization. It destroys the concept that
when a translation unit is translated, the semantic analysis is
complete, such that the only remaining activity is resolution of
external references (linkage), and that the semantic analysis of one
translation unit deos not use information about another translation
unit.
>
This has not yet changed in last April's N3096 draft, where
translation phases 7 and 8 are:
>
7. White-space characters separating tokens are no longer significant.
Each preprocessing token is converted into a token. The resulting
tokens are syntactically and semantically analyzed and translated
as a translation unit.
>
8. All external object and function references are resolved. Library
components are linked to satisfy external references to functions
and objects not defined in the current translation. All such
translator output is collected into a program image which contains
information needed for execution in its execution environment.
>
and before that, the Program Structure section says:
>
The separate translation units of a program communicate by (for
example) calls to functions whose identifiers have external linkage,
manipulation of objects whose identifiers have external linkage, or
manipulation of data files. Translation units may be separately
translated and then later linked to produce an executable program.
>
LTO deviates from the the model that translation units are separate,
and the conceptual steps of phases 7 and 8.
>
Link time optimization is as valid as cross-function optimization *as
long as* it doesn't change the defined behavior of the program.
is an externally visible aspect of the C program.
(That can be inferredThe rules do not forbid semantic analysis across translation units - they merely do not /require/ it. You are making an inference without any justification that I can see.
from the rules which forbid semantic analysis across translation
units, only linkage.)
That's why we can have a real world security issue caused by zeroingNo, it is not. We have real-world security issues for all sorts of reasons, including people mistakenly thinking they can force particular types of code generation by calling functions in different source files.
being optimized away.
The rules spelled out in ISO C allow us to unit test a translationNo, they don't.
unit by linking it to some harness, and be sure it has exactly the
same behaviors when linked to the production program.
If I have some translation unit in which there is a function foo, such5.1.2.2.1p6 lists the three things that C defines as "observable behaviour". Function calls - internal or external - are not amongst these.
that when I call foo, it then calls an external function bar, that's
observable.
I can link that unit to a program which supplies bar,Yes, you can. The printf call - or, more exactly, the "input and output dynamics" - are observable behaviour. The call to "bar", however, is not.
containing a printf call, then call foo and verify that the printf call
is executed.
Since ISO C says that the semantic analysis has been done (thatNo, we can't - see above. Nothing in the C standards forbids any additional analysis, or using other information in code generation.
unit having gone through phase 7), we can take it for granted as a
done-and-dusted property of that translation unit that it calls bar
whenever its foo is invoked.
Can you give examples?Say I have a call to foo in main, and the definition of foo is inThere always situations in which optimizations that have been forbidden
another translation unit. In the absence of LTO, the compiler will have
to generate a call to foo. If LTO is able to determine that foo doesn't
do anything, it can remove the code for the function call, and the
resulting behavior of the linked program is unchanged.
don't cause a problem, and are even desirable.
If you have LTO turned on, you might be programming in GNU C or Clang CYou might be programming in GNU C. You might be programming in a standard C version (modulo bugs in the compiler).
or whatever, not standard C.
Sometimes programs have the same interpretation in GNU C and standard(While I don't much like an "appeal to authority" argument, I think it's worth noting that the major C / C++ compilers, gcc, clang/llvm and MSVC, all support link-time optimisation. They also all work together with both the C and C++ standards committees. It would be quite the scandal if there were any truth in your claims and these compiler vendors were all breaking the rules of the languages they help to specify!)
C, or the same interpretation to someone who doesn't care about certain
differences.
Les messages affichés proviennent d'usenet.