Page MenuHomePhabricator

[Clang][Sema] Warn when function argument is less aligned than parameter

Authored by tmatheson on Feb 22 2021, 2:31 AM.




GCC's attribute((align)) can reduce the alignment of a type when applied to
a typedef. However, functions which take a pointer or reference to the
original type are compiled assuming the original alignment. Therefore when any
such function is passed an object of the new, less-aligned type, an alignment
fault can occur. In particular, this applies to the constructor, which is
defined for the original type and called for the less-aligned object.

This change adds a warning whenever an pointer or reference to an object is
passed to a function that was defined for a more-aligned type.

The calls to ASTContext::getTypeAlignInChars seem change the order in which
record layouts are evaluated, which caused changes to the output of
-fdump-record-layouts. As such some tests needed to be updated:

  • Use CHECK-LABEL rather than counting the number of "Dumping AST Record Layout" headers.
  • Check for end of line in labels, so that struct B1 doesn't match struct B etc.
  • Add --strict-whitespace, since the whitespace shows meaningful structure.
  • The order in which record layouts are printed has changed in some cases.
  • clang-format for regions changed

Diff Detail

Event Timeline

tmatheson requested review of this revision.Feb 22 2021, 2:31 AM
tmatheson created this revision.
Herald added a project: Restricted Project. · View Herald TranscriptFeb 22 2021, 2:31 AM
Herald added a subscriber: cfe-commits. · View Herald Transcript
dnsampaio accepted this revision.Mar 2 2021, 12:49 PM

LGTM . Just a few coding style nits to fix. But please wait a couple of days to see if someone else has anything else to say.


empty line after return.


Follow clang-tidy.

This revision is now accepted and ready to land.Mar 2 2021, 12:49 PM
tmatheson updated this revision to Diff 328972.Mar 8 2021, 4:24 AM
  • Add blank line after retun
  • Apply clang-tidy recommendations
tmatheson marked 2 inline comments as done.Mar 8 2021, 4:25 AM
tmatheson updated this revision to Diff 328985.Mar 8 2021, 5:40 AM

Attempt to fix error on windows: change unsigned long -> int in operator new

tmatheson updated this revision to Diff 328986.Mar 8 2021, 5:45 AM

int -> unsigned long long

tmatheson updated this revision to Diff 328989.Mar 8 2021, 5:53 AM

...use SIZE_TYPE