<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/86282>86282</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libc] revisit `trivial-auto-var-init=pattern`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          SchrodingerZhu
      </td>
    </tr>
</table>

<pre>
    We have enabled `trivial-auto-var-init=pattern` to improve security around uninitialized variables with automatic storage duration. See https://github.com/llvm/llvm-project/pull/78776.

Normally, compiler is start enough to omit pattern filling if the variable is initialized properly after its creation. However, we might want to revisit some situations to see if `[[clang::uninitialized]]` is needed. 

Consider common a situation in internal usage of `syscall` wrappers. We may create a template trivial object on stack as buffer and then pass its address to the syscall interface as `inout` argument.

```
  LinuxStatFs result;
  // On 32-bit platforms, original fstatfs cannot handle large file systems.
  // In such cases, SYS_fstatfs64 is defined and should be used.
#ifdef SYS_fstatfs64
  int ret = syscall_impl<int>(SYS_fstatfs64, fd, sizeof(result), &result);
#else
  int ret = syscall_impl<int>(SYS_fstatfs, fd, &result);
#endif
  if (ret < 0) {
    libc_errno = -ret;
    return cpp::nullopt;
  }
  return result;
``` 

The compiler does not know that the syscall is to populate the fields of the struct. Hence, to be safe, classify it as a possible use before initialization. As a result, one may see the following in the generated code:

![image](https://github.com/llvm/llvm-project/assets/20108837/9df7fc91-0305-462f-a636-696eb17b8302)

For relative large local variable, it may be worthy to bare in mind that we are using pattern filling for trival auto variables. Adding `[[clang::uninitialized]]` will improve the code if we are certain that `asm/syscall` will initialize the variable properly.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVluv4jgS_jXmpQQKDoTwwMO5LOqVVrsPZ6XW7kurElcSTzt2ZFdg6F8_KgPnHFoaaXqkCHKx6_LVV18ZU7K9Jzqo7bPavi5w5iHEw1s7xGCs7yn-f5gXTTCXw1eCAU8E5LFxZEBVBUd7suiWOHNYnjAurbesytcJmSl6VRXAAew4xXAiSNTO0fIFMIbZG5i9LLfo7A8ycMJoxXCCs-UBxOSIbFtIHCL2BGaOyDb4FbwRwcA8JVU-KX1U-thbHuZm1YZR6aNzp_vfcorhN2pZ6eM0O6f0cVfvdtVKFa-qeLr-_jvEEZ27KP0CbRgn6yiCTZAYIwP5MPeDpBFGy3DLDDrrnPU92A54oPfgZd_npKYYJoruAtixWOUEbaRbGl_CmU4Uxe-ZYLT9wHBGz-Is0skmy5DCSJAsz3lPkk-JSNyqqsg1e24d-l6QKJ8eEFXbV7mqQoLyRIbMCj4n_hJ8soaiZD0GD_jhCKxckik6mJPAH7LLdEktOidWzxGniWJawVeCES_XzAgQmMbJye2NHxAaKQIEL6C23wETNHPXUQT0RgD0MGFKGR80JlLKmQqyN4fXaDpsSTarqrA-zCxhYOznkTw_1FTAuV75EeBf1s-_vzHyMUGkNDtW5fP945VD8B8PpV42UmWH3IU4JqlNiLa3gkOXGLlL0KL3gWFAbxyBw9iT8CHHyjSm1U92_-khze0ALSbKFt_-9_btZqzaSHUMddaTyWikIczOQEMwJzL3rHRpO0Pd49a7H-sZIjGo8vWO1zc7Tk6VL9azKv-hdP24Ub9AZ-Q32R8UOqXrGyh6L2-Vrj6e7zgpXZJL9Dedfrj8U-Pe2O7degc5KLH_AoXSe1C794IBONu03yhGH3IAy0ifCwoS2Rw9tNN07Qw_Oxemh6LvXu-3t8U_8eKdQw9N89-BPlTCBEogXPjuwxl4QH7kbGbxFKb52g2D8IScSdJMeSHHueUVfCHfkmDDQQqfsMtPrRN57i5gWViPMIWUrMjMnAga6kKkD7m5qcqTLLwD_ALBX5tTVCMHEJwL5yxdPr_oyVNEJgNtMCRofe4jvVbbZztiT6Iluv5l2cWUiJPSR12si7oud0of96bbde1-vSzKYrvcVLpbYlVWy2pfUbPeNXVZaCHHp0COIUIkh2xP95ZzoUX3rrySq-WcakNwDpGHS4YTM0Yw2qw0yKK18m5OAsLPet6FmFULXZ5AH1NpBU9GBuKv6O7ZCglu048zcUzW7lsILUXGXAZksYtJAPwssdnAu-nHUXOfLTeJWJhDafblHhd0WO_W6_W63G2qxXBoWrNp9nsqO03ruq3kW6OLeqfrer_G_cIedKE3Ran1utRab1e7Yo3bTuN-s67LstZqU9CI1q2ktqsQ-4VNaaZDXelaLxw25FI-QGgtfam0lqNEPGQqNHOf1KZwNnH6MMCWXT505A3b1_eB95dOFYs5usMvUzEHLVTMcf8RAAD__1We7ko">