r184875 - Fix null pointer dereference if we redeclare an unprototyped function. Patch by

Eli Friedman eli.friedman at gmail.com
Tue Jun 25 15:34:58 PDT 2013


On Tue, Jun 25, 2013 at 1:34 PM, Richard Smith
<richard-llvm at metafoo.co.uk>wrote:

> Author: rsmith
> Date: Tue Jun 25 15:34:17 2013
> New Revision: 184875
>
> URL: http://llvm.org/viewvc/llvm-project?rev=184875&view=rev
> Log:
> Fix null pointer dereference if we redeclare an unprototyped function.
> Patch by
> WenHan Gu!
>
> Modified:
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>     cfe/trunk/test/Sema/vfprintf-valid-redecl.c
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=184875&r1=184874&r2=184875&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Jun 25 15:34:17 2013
> @@ -8732,17 +8732,19 @@ Decl *Sema::ActOnStartOfFunctionDef(Scop
>    const FunctionDecl *PossibleZeroParamPrototype = 0;
>    if (ShouldWarnAboutMissingPrototype(FD, PossibleZeroParamPrototype)) {
>      Diag(FD->getLocation(), diag::warn_missing_prototype) << FD;
> -
> +
>      if (PossibleZeroParamPrototype) {
> -      // We found a declaration that is not a prototype,
> +      // We found a declaration that is not a prototype,
>        // but that could be a zero-parameter prototype
> -      TypeSourceInfo* TI =
> PossibleZeroParamPrototype->getTypeSourceInfo();
> -      TypeLoc TL = TI->getTypeLoc();
> -      if (FunctionNoProtoTypeLoc FTL = TL.getAs<FunctionNoProtoTypeLoc>())
> -        Diag(PossibleZeroParamPrototype->getLocation(),
> -             diag::note_declaration_not_a_prototype)
> -          << PossibleZeroParamPrototype
> -          << FixItHint::CreateInsertion(FTL.getRParenLoc(), "void");
> +      if (TypeSourceInfo *TI =
> +              PossibleZeroParamPrototype->getTypeSourceInfo()) {
> +        TypeLoc TL = TI->getTypeLoc();
> +        if (FunctionNoProtoTypeLoc FTL =
> TL.getAs<FunctionNoProtoTypeLoc>())
> +          Diag(PossibleZeroParamPrototype->getLocation(),
> +               diag::note_declaration_not_a_prototype)
> +            << PossibleZeroParamPrototype
> +            << FixItHint::CreateInsertion(FTL.getRParenLoc(), "void");
> +      }
>      }
>    }
>
>
> Modified: cfe/trunk/test/Sema/vfprintf-valid-redecl.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/vfprintf-valid-redecl.c?rev=184875&r1=184874&r2=184875&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Sema/vfprintf-valid-redecl.c (original)
> +++ cfe/trunk/test/Sema/vfprintf-valid-redecl.c Tue Jun 25 15:34:17 2013
> @@ -1,7 +1,13 @@
>  // RUN: %clang_cc1 %s -fsyntax-only -pedantic -verify
>  // expected-no-diagnostics
> -// PR4290
>
> +// PR16344
> +// Clang has defined 'vfprint' in builtin list. If the following line
> occurs before any other
> +// `vfprintf' in this file, and we getPreviousDecl()->getTypeSourceInfo()
> on it, then we will
> +// get a null pointer since the one in builtin list doesn't has valid
> TypeSourceInfo.
> +int vfprintf(void) { return 0; }
> +
> +// PR4290
>  // The following declaration is compatible with vfprintf, so we shouldn't
>  // warn.
>  int vfprintf();
>
> This testcase isn't testing what it was originally supposed to test.

-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130625/dce83631/attachment.html>


More information about the cfe-commits mailing list