[LLVMbugs] [Bug 9486] New: -doesNotRecognizeSelector: not flagged as being "no return"

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Mar 15 15:02:41 PDT 2011


http://llvm.org/bugs/show_bug.cgi?id=9486

           Summary: -doesNotRecognizeSelector: not flagged as being "no
                    return"
           Product: clang
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Static Analyzer
        AssignedTo: kremenek at apple.com
        ReportedBy: tjw at omnigroup.com
                CC: llvmbugs at cs.uiuc.edu


We have code like the following. It looks up a function pointer, and if NULL
calls -doesNotRecognizeSelector:. Otherwise, it may or may not call it. 
clang-sa from trunk r127704 doesn't realize that the NULL pointer path can't be
called and warns:

    Called function pointer is null (null dereference)

This is easily avoided with __attribute__((analyzer_noreturn)), but it might be
nice to have this method flagged as 'no return' automatically.

- (void)setValue:(id)value forKey:(NSString *)key;
{
    ODOProperty *prop = [[self->_objectID entity] propertyNamed:key];
    if (!prop) {
        [super setValue:value forKey:key];
        return;
    }

    // We only prevent write access via the generic KVC method for now.  The
issue is that we want to allow a class to redefined a property as writable
internally if it wants, so it should be able to use 'self.foo = value' (going
through the dynamic or any self-defined method). But subclasses could still
-setValue:forKey: and get away with it w/o a warning. This does prevent the
class itself from using generic KVC, but hopefully that is rare enough for this
to be a good tradeoff.
    struct _ODOPropertyFlags flags = ODOPropertyFlags(prop);
    if (flags.calculated)
        OBRejectInvalidCall(self, _cmd, @"Attempt to -setValue:forKey: on the
calculated key '%@'.", key);

    ODOPropertySetter setter = ODOPropertySetterImpl(prop);
    SEL sel = ODOPropertySetterSelector(prop);
    if (!setter) {
        // We have a property but no setter; presumably it is read-only.
        [self doesNotRecognizeSelector:sel];
    }

    // Avoid looking up the property again
    if (setter == ODOSetterForUnknownOffset)
        ODODynamicSetValueForProperty(self, sel, prop, value);
    else
        setter(self, sel, value);
}

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list