News for hackers. Stuff that matters.
Re:How I implemented my own crypto by simias on Thursday August 03, 2017 @11:09AM (#14920232)
I can't edit this comment anymore but I'm replying to myself to point out this little bit of C "trivia": the printf function itself, probably the most iconic standard function of all, is not portable.

The problem is that it returns an "int" which contains a negative value on errors and the number of character written on success.

Of course that means that it's possible to write a string whose size doesn't fit in an int.

For instance if you have a 64bit computer (and enough RAM) you can try the following code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <string.h>

    int main(void) {
      size_t len = 0x80000001UL;
      char *str = malloc(len);

      assert(str);

      memset(str, 'a', len);
    
      str[len - 1] = '\0';
    
      fprintf(stderr, "\n%d\n", printf(str));

      return 0;
    }
Don't forget to redirect stdout to /dev/null. You can pipe through `wc -c` if you want to make sure the billion 'a's are printed.

On my computer the "printf" manages to print the whole string successfully but it returns... -1, signaling an error.

The size shouldn't be returned that way, it should be a "size_t" as an output parameter (since you also need a special value for errors). In Rust you'd use "Result<usize>" and you'd have a more elegant solution. Of course you can't really do that in C (except by returning a struct, which is a bit cumbersome) so I guess they said "meh, who prints that much text anyway?" and assumed an int would be good enough.

There are no comments on this comment yet.