<div dir="ltr">Hello list,<div><br></div><div>Hope this is the right place to post this question. So I am writing to understand assumptions made by Clang, in terms of the values of uninitialized variables on the stack. </div><div><br></div><div>My observation is that when Clang compiles the following piece of code without any optimization, the assembly code will check the path condition, and assign variable t with whatever keeps on the stack, which seems pretty reasonable to me. </div><div><br></div><div><pre style="white-space:pre-wrap;margin-top:0px;margin-bottom:1em;padding:5px;border:0px;font-variant-numeric:inherit;font-variant-east-asian:inherit;font-stretch:inherit;line-height:inherit;font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace,sans-serif;font-size:13px;vertical-align:baseline;box-sizing:inherit;width:auto;max-height:600px;overflow:auto;background-color:rgb(239,240,241);color:rgb(36,39,41)"><code style="margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace,sans-serif;vertical-align:baseline;box-sizing:inherit;white-space:inherit">int main() {

        char a[20];
        char* p = a;
        int t;
        if (p) {
                t = p[7];
        }

        return t;
}</code></pre></div><div><br></div><div>On the other hand, when optimized with -O2, the whole if condition is gone, and t is assigned with zero (i.e., xor eax, eax), then returned at the end of the main function.</div><div><br></div><div>So directly reading from the uninitialized variables are considered to be "undefined behavior". And as far as I can see, compiler shouldn't make any assumption on the that, right? My test environment is 64-bit Ubuntu 18.04 with Clang version 5.0. </div><div><br></div><div>I am trying to understand whether clang -O2 utilizes some analysis to make sure the initial value of stack variables must be zeroed. At least so far from the assembly code and the <a href="https://stackoverflow.com/questions/15548023/clang-optimization-levels" target="_blank">enabled compiler options by -O2</a> I didn't figure out such tricks. Am I missed anything here?</div><div><br></div><div>Thanks,</div><div>Irene</div></div>