drh / lcc

The lcc retargetable ANSI C compiler
https://drh.github.io/lcc/
2.03k stars 442 forks source link

Pointers incorrectly become NULL #5

Open jmanuel1 opened 10 years ago

jmanuel1 commented 10 years ago

Lcc will compile this code incorrectly, making the pointer in the struct iter_obj passed to iterate become NULL when it really isn't supposed too.

#include <stdio.h>

struct iter_obj
{
    void *iterable;
};

#define new_iter_obj(iter) {iter}

void *array_item(int index, void *iterable)
{    
    if (index < 10)
    {
        return (void *) &(((int *) iterable)[index]);
    }
    else
    {
        return NULL;
    }
}

void iterate(struct iter_obj *obj)
{
    void *tmp;
    int index = 0;

    /* obj->iterable == NULL, but it should point to countdown in main */
    while ((tmp = array_item(index, obj->iterable)) != NULL)
    {
        printf("%d\n", *((int *) tmp));
        index++;
    }
}

int main()
{
    int countdown[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    /* cd_iter.iterable == countdown */
    struct iter_obj cd_iter = new_iter_obj((void *) countdown);

    iterate(&cd_iter);
}