On Sunday, 2 September 2018 at 04:21:44 UTC, Jonathan M Davis wrote:
On Saturday, September 1, 2018 9:18:17 PM MDT Nick Sabalausky (Abscissa) via Digitalmars-d wrote:

So honestly, I don't find it at all surprising when an application can't handle not being able to write to disk. Ideally, it _would_ handle it (even if it's simply by shutting down, because it can't handle not having enough disk space), but for most applications, it really is thought of like running out of memory. So, isn't tested for, and no attempt is made to make it sane.

One reason why programs using stdio do fail with disk space errors is that they don't know that fclose() can be the function reporting it, not the fwrite()/fputs()/fprintf(). I can not count the number of times I saw things like that:

    FILE *fd = fopen(...,"w");

    if(fwrite(buffer, length, 1)<1) {
      fine error handling
    fclose(fd);

on disk fullness the fwrite might have accepted the data, but only the fclose() really flushed the data to disk, only detecting the lack of space at that moment.


Honestly, for some of this stuff, I think that the only way that it's ever going to work sanely is if extreme failure conditions result in Errors or Exceptions being thrown, and the program being killed. Most code simply isn't ever going to be written to handle such situations, and a for a _lot_ of programs, they really can't continue without those resources - which is presumably, why the way D's GC works is to throw an OutOfMemoryError when it can't allocate anything. Anything C-based (and plenty of C++-based programs too) is going to have serious problems though thanks to the fact that C/C++ programs often use APIs where you have to check a return code, and if it's a function that never fails under normal conditions, most programs aren't going to check it. Even diligent programmers are bound to miss some of them.

Indeed, since some of those error checks also differ from OS to OS, some cases might detect things in one setting but not in others. See my example above, on DOS or if setvbuf() was set to NULL it would not possibly happen as the fwrite() would always flush() the data to disk and the error condition would be catched nearly 99.9999% of times.

Reply via email to