<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jul 15, 2016, at 1:03 PM, Argyrios Kyrtzidis <<a href="mailto:akyrtzi@gmail.com" class="">akyrtzi@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><br class="Apple-interchange-newline">On Jul 15, 2016, at 12:58 PM, Ben Langmuir <<a href="mailto:blangmuir@apple.com" class="">blangmuir@apple.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br class="Apple-interchange-newline">On Jul 15, 2016, at 12:22 PM, Argyrios Kyrtzidis via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""><br class="">Author: akirtzidis<br class="">Date: Fri Jul 15 14:22:34 2016<br class="">New Revision: 275600<br class=""><br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=275600&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=275600&view=rev</a><br class="">Log:<br class="">[objcmt] Fix a buffer overflow crash than can occur while modernizing enums.<br class=""><br class="">Note that due to the nature of the crash it requires libgmalloc or asan for it to crash consistently.<br class=""><br class=""><a href="rdar://19932927" class="">rdar://19932927</a><br class=""><br class="">Added:<br class=""> cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m<br class=""> cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m.result<br class="">Modified:<br class=""> cfe/trunk/lib/ARCMigrate/ObjCMT.cpp<br class=""> cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result<br class=""><br class="">Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=275600&r1=275599&r2=275600&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=275600&r1=275599&r2=275600&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)<br class="">+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Fri Jul 15 14:22:34 2016<br class="">@@ -771,23 +771,11 @@ static void rewriteToNSMacroDecl(ASTCont<br class=""> ClassString += ", ";<br class=""><br class=""> ClassString += TypedefDcl->getIdentifier()->getName();<br class="">- ClassString += ')';<br class="">- SourceLocation EndLoc;<br class="">- if (EnumDcl->getIntegerTypeSourceInfo()) {<br class="">- TypeSourceInfo *TSourceInfo = EnumDcl->getIntegerTypeSourceInfo();<br class="">- TypeLoc TLoc = TSourceInfo->getTypeLoc();<br class="">- EndLoc = TLoc.getLocEnd();<br class="">- const char *lbrace = Ctx.getSourceManager().getCharacterData(EndLoc);<br class="">- unsigned count = 0;<br class="">- if (lbrace)<br class="">- while (lbrace[count] != '{')<br class="">- ++count;<br class="">- if (count > 0)<br class="">- EndLoc = EndLoc.getLocWithOffset(count-1);<br class="">- }<br class="">- else<br class="">- EndLoc = EnumDcl->getLocStart();<br class="">- SourceRange R(EnumDcl->getLocStart(), EndLoc);<br class="">+ ClassString += ") ";<br class="">+ SourceLocation EndLoc = EnumDcl->getBraceRange().getBegin();<br class="">+ if (EndLoc.isInvalid())<br class="">+ return;<br class="">+ CharSourceRange R = CharSourceRange::getCharRange(EnumDcl->getLocStart(), EndLoc);<br class=""> commit.replace(R, ClassString);<br class=""> // This is to remove spaces between '}' and typedef name.<br class=""> SourceLocation StartTypedefLoc = EnumDcl->getLocEnd();<br class="">@@ -1900,18 +1888,20 @@ void ObjCMigrateASTConsumer::HandleTrans<br class=""> if (++N == DEnd)<br class=""> continue;<br class=""> if (const EnumDecl *ED = dyn_cast<EnumDecl>(*N)) {<br class="">- if (++N != DEnd)<br class="">- if (const TypedefDecl *TDF = dyn_cast<TypedefDecl>(*N)) {<br class="">- // prefer typedef-follows-enum to enum-follows-typedef pattern.<br class="">- if (migrateNSEnumDecl(Ctx, ED, TDF)) {<br class="">- ++D; ++D;<br class="">- CacheObjCNSIntegerTypedefed(TD);<br class="">- continue;<br class="">+ if (canModify(ED)) {<br class=""></blockquote><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;">Is this change tested anywhere? It looks orthogonal to the source range changes.</span><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"></div></blockquote><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">You are right that it is orthogonal. It avoids unnecessary work, it’s not changing behavior.</div></div></blockquote><div><br class=""></div><div>On second look, test case in r275609 shows behavior improvement.</div><div>Without this change, 'ARCMT/whitelisted/objcmt-with-whitelist.m’ will fail.</div><br class=""><blockquote type="cite" class=""><div class=""><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">+ if (++N != DEnd)<br class="">+ if (const TypedefDecl *TDF = dyn_cast<TypedefDecl>(*N)) {<br class="">+ // prefer typedef-follows-enum to enum-follows-typedef pattern.<br class="">+ if (migrateNSEnumDecl(Ctx, ED, TDF)) {<br class="">+ ++D; ++D;<br class="">+ CacheObjCNSIntegerTypedefed(TD);<br class="">+ continue;<br class="">+ }<br class=""> }<br class="">+ if (migrateNSEnumDecl(Ctx, ED, TD)) {<br class="">+ ++D;<br class="">+ continue;<br class=""> }<br class="">- if (migrateNSEnumDecl(Ctx, ED, TD)) {<br class="">- ++D;<br class="">- continue;<br class=""> }<br class=""> }<br class=""> CacheObjCNSIntegerTypedefed(TD);<br class=""><br class="">Added: cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m?rev=275600&view=auto" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m?rev=275600&view=auto</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m (added)<br class="">+++ cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m Fri Jul 15 14:22:34 2016<br class="">@@ -0,0 +1,14 @@<br class="">+// RUN: rm -rf %t<br class="">+// RUN: %clang_cc1 -objcmt-migrate-ns-macros -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -triple x86_64-apple-darwin11<br class="">+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result<br class="">+<br class="">+#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type<br class="">+#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type<br class="">+typedef long NSInteger;<br class="">+<br class="">+typedef enum : NSInteger {five} ApplicableEnum;<br class="">+<br class="">+typedef unsigned long mytd;<br class="">+<br class="">+#define MY_ENUM(name, type, ...) typedef enum : type { __VA_ARGS__ } name##_t<br class="">+MY_ENUM(MyEnum, unsigned int, One);<br class=""><br class="">Added: cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m.result<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m.result?rev=275600&view=auto" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m.result?rev=275600&view=auto</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m.result (added)<br class="">+++ cfe/trunk/test/ARCMT/objcmt-ns-enum-crash.m.result Fri Jul 15 14:22:34 2016<br class="">@@ -0,0 +1,14 @@<br class="">+// RUN: rm -rf %t<br class="">+// RUN: %clang_cc1 -objcmt-migrate-ns-macros -mt-migrate-directory %t %s -x objective-c -fobjc-runtime-has-weak -fobjc-arc -triple x86_64-apple-darwin11<br class="">+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result<br class="">+<br class="">+#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type<br class="">+#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type<br class="">+typedef long NSInteger;<br class="">+<br class="">+typedef NS_ENUM(NSInteger, ApplicableEnum) {five};<br class="">+<br class="">+typedef unsigned long mytd;<br class="">+<br class="">+#define MY_ENUM(name, type, ...) typedef enum : type { __VA_ARGS__ } name##_t<br class="">+MY_ENUM(MyEnum, unsigned int, One);<br class=""><br class="">Modified: cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result?rev=275600&r1=275599&r2=275600&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result?rev=275600&r1=275599&r2=275600&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result (original)<br class="">+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result Fri Jul 15 14:22:34 2016<br class="">@@ -77,7 +77,7 @@ typedef NS_ENUM(NSInteger, UIK) {<br class=""> UIKTwo = 2,<br class="">};<br class=""><br class="">-typedef NS_ENUM(unsigned int, NSTickMarkPosition) {<br class="">+typedef NS_ENUM(unsigned int, NSTickMarkPosition) {<br class=""> NSTickMarkBelow = 0,<br class=""> NSTickMarkAbove = 1,<br class=""> NSTickMarkLeft = NSTickMarkAbove,<br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a></blockquote></div></blockquote></div></blockquote></div><br class=""></body></html>