What sense do these clobbered variable warnings make?

廉价感情. 提交于 2019-12-03 01:49:27

After scraping the net a bit, and re-reading the GCC docs, I came across this:

Function Attributes:

returns_twice

The returns_twice attribute tells the compiler that a function may return more than one time. The compiler will ensure that all registers are dead before calling such a function and will emit a warning about the variables that may be clobbered after the second return from the function. Examples of such functions are setjmp and vfork. The longjmp-like counterpart of such function, if any, might need to be marked with the noreturn attribute.

So it appears that GCC does not have any "special knowledge" of setjmp, it just insinuates that it does. All it knows is that setjmp returns twice, not that it always returns 0 the first time and nonzero afterwards. Gosh, that would have been nice.

rodrigo

From man longjmp:

The values of automatic variables are unspecified after a call to longjmp() if they meet all the following criteria:

   ·  they are local to the function that made the corresponding setjmp(3)
      call;

   ·  their  values  are  changed  between  the  calls  to  setjmp(3)  and
      longjmp(); and

   ·  they are not declared as volatile.

As it happens, your x variable in the first example meets the criteria:

  • It is local to the function, as function parameters are just like local automatic variables.
  • Its value may be changed just after setjmp if some_global is true.
  • It is not volatile.

So its value may be unspecified (clobbered).

About why the second version does not emit the warning... no idea.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!