zeux wrote:

Here's a slightly smaller reproducer that just reads one element from the 
array. Similarly, this crashes because the compiler generates a load from an 
absolute `-1` address. The crash is after the first `printf` call in this case 
during the computation of the argument to the second `printf` call. (the code 
is fairly non-sensical in this revision, but maybe it helps to analyze this!).

```c++
#include <stdio.h>
#include <stdint.h>
#include <string.h>

class xml_buffered_writer
{
public:
        xml_buffered_writer(): bufsize(0)
        {
        }

        __attribute__((noinline))
        void write_string(const char* data)
        {
                // write the part of the string that fits in the buffer
                size_t offset = bufsize;

                while (*data && offset < bufcapacity)
                        buffer[offset++] = *data++;

                // write the rest
                if (offset < bufcapacity)
                {
                        bufsize = offset;
                }
                else
                {
                        // backtrack a bit if we have split the codepoint
                        size_t length = offset - bufsize;
                        const char* data_back = data - length;
                        printf("length %d\n", int(length));
                        printf("last char %c\n", data_back[length-1]);

                        bufsize = offset;
                }
        }

        enum
        {
                bufcapacity = 16
        };

        char buffer[bufcapacity];
        size_t bufsize;
};

int main()
{
        xml_buffered_writer writer;
        writer.write_string("abcdefghijklmnopqrstuvwxyz");
        printf("\n");
}
```


https://github.com/llvm/llvm-project/pull/107257
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to