Hi Quincey

thanks for the answer

it’s not clear what kind of pointer was returned by the program, because

code was build with optimization, so I wasn’t able to stop there in debugger

in any attempt to do something like

size_t m = (size_t)data;

and print m out clang started to behave as expected and didn’t optimize malloc

also the following code


    unsigned char *data = (unsigned char *)malloc(need_size);
    
    if(data[0x10000] == 0) {
        printf("data == NULL\n");
        return 1;
    } else {
        printf("data != NULL\n");
    }


behaves incorrectly, it should SEGV, but malloc again was optimized out and I 
got the same result:

data != NULL
Program ended with exit code: 0


another observation


the following code

    unsigned char *data = (unsigned char *)malloc(need_size);
    
    if(data == NULL) {
        printf("data == NULL\n");
        return 1;
    } else {
        printf("data != NULL <<<%d>>>\n", (int)data[0x100000]);
    }
    free(data);

didn’t SEGV and returns

data != NULL <<<0>>>
Program ended with exit code: 0

and that is clearly wrong and obviously I’m using result of the malloc call 
here.



> On Jul 4, 2016, at 2:55 PM, Quincey Morris 
> <quinceymor...@rivergatesoftware.com> wrote:
> 
> On Jul 4, 2016, at 11:09 , Dmitry Markman <dmark...@mac.com> wrote:
>> 
>> The compiler "knows" how malloc works, and is allowed to optimize as if it 
>> never fails. 
> 
> I don’t know the answer, but it seems to me at least possible that it didn’t 
> fail. It’s at least possible that it gave you an unmapped virtual allocation 
> of the size you asked for.
> 
> Under that theory, the reason for different behavior in a release build would 
> be that it chooses to omit availability checking, perhaps because determining 
> the amount of “real” memory is subtle and would be an unacceptable overhead. 
> You could find out for sure by looking at the Darwin source code, I suppose.
> 
> Incidentally, what pointer does it return in the release build? Does it look 
> like a valid pointer? Can it be used as a valid pointer (e.g. for setting 
> byte 0 of the block to something)?
> 
> Also, the 48 bits of memory address space your block consumes is possibly 
> within the range of what address space is normally available to apps. What 
> happens if you request a much larger amount (e.g. 2 * 64 - 1)?
> 

Dmitry Markman


 _______________________________________________
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