<div dir="ltr">Hi, checker devs<br><br>TLDR:<br>How to constrain the size of unknown memory regions, eg. pointed by 'raw' char pointers?<br><br>longer version:<br>Working on taint analysis I'm facing with the following problem:<br><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace">void strncpy_bounded_tainted_buffer(char *src, char *dst) {</span><br><span style="font-family:monospace">  // assert(strlen(src) >= 10 && "src must have at leas 10 elements");</span><br><span style="font-family:monospace">  int n;</span><br><span style="font-family:monospace">  scanf("%d", &n);</span><br><span style="font-family:monospace">  if (0 < n && n < 10) {</span><br><span style="font-family:monospace">    strncpy(dst, src, n); // Should we warn or not?</span><br><span style="font-family:monospace">  }</span><br><span style="font-family:monospace">}</span><br></blockquote><br><br>In this example we analyze a function taking two raw pointers, so we don't know how big those arrays are.<br>We will check the `<span style="font-family:monospace">strncpy</span>` call, whether it will access <i>(read and write)</i> only valid memory.<br>We will check the pointers (<span style="font-family:monospace">src</span> and <span style="font-family:monospace">dst</span>) separately by checking if <i>`</i>&src[0]` and <span style="font-family:monospace">`&src[n-1]`</span> would be in bound of the memory region pointed by the pointer. Since the analyzer don't know (both states are non-null), we should check if the `<span style="font-family:monospace">length</span>` parameter is tainted, and if so, we should still issue a warning telling that "String copy function might overflow the given buffer since untrusted data is used to specify the buffer size."<br>Obviously, if the `<span style="font-family:monospace">length</span>` parameter is not tainted, we will assume (conservatively) that the access would be valid.<br><br><br>How should tell the analyzer that the array which is pointed by the pointer holds at least/most N elements?<br>For example in the code above, express something similar via an assertion, like saying that `src` points to a c-string, which has at least 10 + 1 element underlying storage.<br>Although this assertion using `<span style="font-family:monospace">strlen</span>` seems like a solution, unfortunately not applicable for example to the `<span style="font-family:monospace">dst</span>` buffer, which is most likely uninitialized - so not a c-string, in other words calling `<span style="font-family:monospace">strlen</span>` would be undefined behavior.<br><br>The only (hacky) option which came in my mind was to abuse the standard regarding pointer arithmetic.<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span style="font-family:monospace">assert(&src[n] - &src[-1]);</span><br></blockquote>The standard is clear about that pointer arithmetic is only applicable for pointers pointing to elements of the same array OR to a hypothetical ONE past/before element of that array.<br><a href="http://eel.is/c++draft/expr.add#4.2">http://eel.is/c++draft/expr.add#4.2</a><br><br>This assertion would be undefined behavior if the size of the array pointed by `<span style="font-family:monospace">src</span>` would be smaller than `<span style="font-family:monospace">n</span>`.<br><br>IMO this looks really ugly.<br>I think that no '<i>annotations</i>' should introduce UB even if that assumption expressed via an annotation is turned out to be <u>invalid</u>.<br><br><br>What would be the right approach to guide (to constrain the size of a memory region) the analyzer?<br>How can the analyzer inference such constraint?<br><div><br></div><div>Thanks Balazs.<br></div></div>