[PATCH][modules][PR26237]
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 23 17:05:53 PST 2016
Calling getMostRecentDecl seems like a slightly fragile way to avoid
iterator invalidation here. Instead...
@@ -214,6 +212,19 @@ namespace clang {
unsigned I = Record.size();
Record.push_back(0);
+ auto &Specializations = Common->Specializations;
+ auto &&PartialSpecializations = getPartialSpecializations(Common);
+
+ // AddFirstDeclFromEachModule might trigger deserialization, invalidating
+ // *Specializations iterators. Force the deserialization in advance.
+ llvm::SmallVector<const Decl*, 16> Specs;
+ for (auto &Entry : Specializations)
+ Specs.push_back(getSpecializationDecl(Entry));
+ for (auto &Entry : PartialSpecializations)
+ Specs.push_back(getSpecializationDecl(Entry));
+ for (auto *D : Specs)
+ D->getMostRecentDecl();
... delete these two lines, and...
+
for (auto &Entry : Specializations) {
... iterate over "Specs" here....
auto *D = getSpecializationDecl(Entry);
... and you don't need this line any more.
assert(D->isCanonicalDecl() && "non-canonical decl in set");
You can then remove the following, identical, PartialSpecializations loop.
You also have some tabs in your patch (on the Specs.push_back lines);
please fix those prior to commit. With those changes, this LGTM.
On Mon, Feb 22, 2016 at 7:11 AM, Vassil Vassilev <v.g.vassilev at gmail.com> wrote:
> ping...
>
> On 30/01/16 21:13, Vassil Vassilev wrote:
>
> On 30/01/16 18:36, David Blaikie wrote:
>
>
>
> On Sat, Jan 30, 2016 at 9:00 AM, Vassil Vassilev <v.g.vassilev at gmail.com>
> wrote:
>>
>> AFAICT the making a test case independent on STL is the hard part. I think
>> it will be always failing due to the relocation of the memory region of the
>> underlying SmallVector.
>
>
> Sorry, I think I didn't explain myself well. What I mean is - due to the
> instability of test cases for UB (especially library UB), we don't usually
> commit test cases for them - we just fix them without tests. About the only
> time I think committing a test is helpful for UB (especially library UB) is
> if we have a reliable way to test/catch the UB (eg: the sanitizers or a
> checking STL that fails fast on validation violations). So, while it would
> be good to provide/demonstrate your test case, I would not commit the test
> case unless it's a minimal reproduction in the presence of one of those
> tools (sanitizers or checking STL) - and would just commit the fix without a
> test case, usually.
>
> (I'm not actually reviewing this patch - I don't know much about the modules
> code, but just providing a bit of context and first-pass-review)
>
> Got it. Thanks!
> --Vassil
>
>
>>
>>
>> On 30/01/16 17:37, David Blaikie wrote:
>>
>> Yeah, it's good to have a reproduction, but I wouldn't actually commit one
>> - unless you have a checked stl to test against that always fails on
>> possibly-invalidating sequences of operations, then you'd have a fairly
>> simple reproduction
>>
>> On Jan 30, 2016 8:23 AM, "Vassil Vassilev" <v.g.vassilev at gmail.com> wrote:
>>>
>>> Sorry.
>>>
>>> Our module builds choke on merging several modules, containing
>>> declarations from STL (we are using libc++, no modulemaps).
>>>
>>> When writing a new module containing the definition of a STL
>>> reverse_iterator, it collects all its template specializations. Some of the
>>> specializations need to be deserialized from a third module. This triggers
>>> an iterator invalidation bug because of the deserialization happening when
>>> iterating the specializations container itself. This happens only when the
>>> container's capacity is exceeded and the relocation invalidates the
>>> iterators and at best causes a crash (see valgrind reports in the bug
>>> report). Unfortunately I haven't been able to make the reproducer
>>> independent on STL.
>>>
>>> --Vassil
>>>
>>> On 30/01/16 17:08, David Blaikie wrote:
>>>
>>> It might be handy to give an overview of the issue in the review (&
>>> certainly in the commit) message rather than only citing the bug number
>>>
>>> On Jan 30, 2016 6:49 AM, "Vassil Vassilev via cfe-commits"
>>> <cfe-commits at lists.llvm.org> wrote:
>>>>
>>>> Attaching a fix to https://llvm.org/bugs/show_bug.cgi?id=26237
>>>>
>>>> Please review.
>>>>
>>>> Many thanks!
>>>> --Vassil
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>
>>
>
>
>
More information about the cfe-commits
mailing list