<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/121832>121832</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang/asan: strtol() interceptor doesn't report out-of-range values (incorrect behavior of sanitized program)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
kalibera
</td>
</tr>
</table>
<pre>
It seems that strtol() under clang/asan doesn't set errno to ERANGE when the resulting value is out of range. I've ran into this on Windows with Msys2 build of llvm (clang64 toolchain).
The example further below, compiled via "clang -o t test.c" correctly prints:
```
Input: 12345689012
LONG_MAX=2147483647
Out of range
```
However, when compiled via " clang -o t test.c -fsanitize=address", it (incorrectly) prints:
```
Input: 12345689012
LONG_MAX=2147483647
Result: 2147483647
```
This is with clang version 19.1.6 on x86_64 and errno remains at value 0.
The example is:
```
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char **argv) {
char *s = "12345689012";
char *endp;
long res;
printf("Input: %s\n", s);
printf("LONG_MAX=%ld\n", LONG_MAX);
errno = 0;
res = strtol(s, &endp, 10);
if (*endp != '\0') {
printf("Incomplete.\n");
return 1;
}
if (errno == ERANGE) {
printf("Out of range");
return 2;
}
printf("Result: %ld\n", res);
return 0;
}
```
The practice of setting errno to zero before calling strtol() and checking errno after the call follows POSIX recommendation.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVVFv2zgM_jXMC5HApu3EefCD1yy7Arf1sBtwextkm451U6RAotN1v_4gJ02Trns7oEBqUSQ_8iM_qRD0zjJXULyDYjNTowzOV9-V0Q17NWtc91TdCwbmfUAZlGAQL84AlUBrHG3HHluj7A5oq4Ky2DkOFmgVnQTZe-tQHL7_XH_68B4fB7YoA6PnMBrRdodHZUZGHdCNgq5Hr-yOF3gPtDpy_EJtxaEM8YrFf7Tt3GPARy0DfgxPgbAZtemiqzHHPQKVE6BljuKcaQelLdB6AUkNSf1lYOQfan8wjP3oZWCPDRv3CHSHrdsftOEOj1ohEE1xcO5QUDjIogUibJ333Ip5woPXVgJk9Sk0LJPzX1Lf28MokNWYUpYXy3KdpARJ_efDpw_fPtZfIdtQmq_yMlvmK0jqh6vSX0WCpP7DPfKRfUQ49e81TPwFJ877oKwW_ZMh26iu8xwCEMUQWmKLtL3UEYn8_0r5PBEb798cX0f8EqnUZwpP2I_sg3YW0_UiXSwjzz_K5bdljsp25yHyvFfaBlRyHpnkDUr12zUAZdq2ZuwYIbszeq8lLAbI3v9iC9Jp91uT0c3btgnixZTU2grup8Er47_K79ppwAblEagGqpXfHWPnYfUOkhovpoCQbSKr1-0mguz2Gtvu8HxmnN3FhTp9x6OJzn5aUrrwB1QEKO7seQ4C0Po5wvX9K2KBCtNduVxMF88TNRFx8hzL86mEi1CE6Aq0nCDTHabJVWbd45R2KgiB0lP1Kyjukvjz0qHbmuIOGBZeXOBdQkYIMnqL6fMJrDZXyS6YY6qTLv0mzc1avp2DXue49n_ZhdedjGy9RDvHOrfwFOmVBsQhP3jVim45Ygosk3peBPYne4cN984ztsqYaLzR6rhJ7cDt9xc31Qv7SY6jB_bOmCitfz38ff8VPbduv2fbKdHOxl2bdVXWrbO1mnGVrrJlui5WeT4bqnSZUdl0ZZf0K2oKztp8zWVflukqVUWXz3RFCRVJmiwpyYo8X6Qt56roio77ZN2nCvIkrrdZRAlfOL-b6RBGrlJKy4xmRjVswvRKnVU59rHYzHwVHebNuAuQJ0YHCS8hRIvh6vp1ilTcNEVbYd_yQZy_erk8H5yX-CDNXT-f6D9pTriRTmx4UEft_ETIWW87PHi382oPtJ6N3lSDyGFSJdoCbXdahrFZtG4PtI1Izz_zg3f_citA26nyALQ9F3-s6L8AAAD__w5jSYY">