Dmitri,

The clang code generator and static analyzer are very smart — I’m pretty sure 
that, for a small malloc where a pointer to the data is never passed outside 
the current function, the malloc/free can be replaced with a buffer in on the 
stack — equivalent of alloca().

WAYRTTD? Your test case may be too contrived.

Are you just trying to understand why malloc() is getting optimized out or are 
you trying to find an actual bug? 

If you’re testing for a compiler bug, pass the pointer to an external function 
whose implementation the complier can’t see:

create a file foo.c containing

void foo(char* baz);

void foo(char* baz)
{
        // whatever logging you want
}

then in your code:

void foo(char* baz);

   if(data == NULL) {
       printf("data == NULL\n");
       return 1;
   } else {
        foo(data);
       for(size_t i = 0; i < need_size; ++i) {
#if 0
           size_t c = i % 64;
           c += 63;
           data[i] = c;
#else
           data[i] = 'A';
#endif
       }
       printf("data != NULL <<%c>>\n", data[0x10000]);
   }
   free(data);


For instance, in your code, if the compiler can see you’re only touching the 
first 100 bytes of *data and you’re never doing anything that could pass a 
pointer to the data out of scope, it could just return a pointer to a 100 byte 
block on the stack and no-op the malloc and free and still generate correct 
behavior. You can defeat this by making the code between malloc() and free() 
sufficiently complex.

Also, you may want to check out this document: 
https://developer.apple.com/library/prerelease/content/documentation/Performance/Conceptual/ManagingMemory/Articles/MemoryAlloc.html

as it has a fair bit of information about how malloc actually works.

HTH,

-Steve



> On Jul 4, 2016, at 4:48 PM, Dmitry Markman <dmark...@mac.com> wrote:
> 
> another observation
> 
> the following code
> 
> 
>    char *data = (char *)malloc(need_size);
> 
>    if(data == NULL) {
>        printf("data == NULL\n");
>        return 1;
>    } else {
>        for(size_t i = 0; i < need_size; ++i) {
> #if 0
>            size_t c = i % 64;
>            c += 63;
>            data[i] = c;
> #else
>            data[i] = 'A';
> #endif
>        }
>        printf("data != NULL <<%c>>\n", data[0x10000]);
>    }
>    free(data);
> 
> 
> returns
> 
> data != NULL <<A>>
> Program ended with exit code: 0
> 
> but if you replace #if 0 to #if 1
> 
> it started to behave correctly (data = NULL)
> 
> dm
> 
> 
> 
> 
> 
> 
>> On Jul 4, 2016, at 4:20 PM, Carl Hoefs <newsli...@autonomy.caltech.edu> 
>> wrote:
>> 
>> 
>>> On Jul 4, 2016, at 12:58 PM, Clark Cox <clarkc...@gmail.com> wrote:
>>> 
>>> Malloc effectively *never* returns NULL. 
>> 
>> It does seem that malloc returns NULL on error...
>> 
>> #include <stdlib.h>
>> #include <stdio.h>
>> 
>> int main(int argc, const char * argv[]) {
>>  size_t need_size = 0x1000000000000;
>> 
>>  char *data = "dummy";      // data ptr is not NULL
>>  data = malloc(need_size);  // data ptr overwritten
>> 
>>  if(data == NULL) {
>>      printf("ERROR data == %p\n",data);  // <----- data is NULL
>>      return 1;
>>  } else {
>>      printf("OKAY data != NULL: %p\n",data);
>>  }
>>  data[0] = 'c';
>> 
>>  free(data);
>> 
>>  return 0;
>> }
>> 
>> mtest(3008,0x7fff786d1300) malloc: *** mach_vm_map(size=281474976710656) 
>> failed (error code=3)
>> *** error: can't allocate region
>> *** set a breakpoint in malloc_error_break to debug
>> ERROR data == 0x0
>> 
>> 
> 
> Dmitry Markman
> 
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Xcode-users mailing list      (Xcode-users@lists.apple.com 
> <mailto:Xcode-users@lists.apple.com>)
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/xcode-users/sgs-lists%40codewell.com 
> <https://lists.apple.com/mailman/options/xcode-users/sgs-lists%40codewell.com>
> 
> This email sent to sgs-li...@codewell.com <mailto:sgs-li...@codewell.com>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list      (Xcode-users@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/xcode-users/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to