Tôi đã biên soạn một số mã Qt với trình biên dịch nacl của google, nhưng trình xác thực ncval không bẻ khóa nó. Một ví dụ trong số rất nhiều:mã được biên dịch lẻ
src/corelib/animation/qabstractanimation.cpp:165
Dưới đây là các mã có liên quan:
#define Q_GLOBAL_STATIC(TYPE, NAME) \
static TYPE *NAME() \
{ \
static TYPE thisVariable; \
static QGlobalStatic<TYPE > thisGlobalStatic(&thisVariable); \
return thisGlobalStatic.pointer; \
}
#ifndef QT_NO_THREAD
Q_GLOBAL_STATIC(QThreadStorage<QUnifiedTimer *>, unifiedTimer)
#endif
mà biên dịch để:
00000480 <_ZL12unifiedTimerv>:
480: 55 push %ebp
481: 89 e5 mov %esp,%ebp
483: 57 push %edi
484: 56 push %esi
485: 53 push %ebx
486: 83 ec 2c sub $0x2c,%esp
489: c7 04 24 28 00 2e 10 movl $0x102e0028,(%esp)
490: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
494: 8d bc 27 00 00 00 00 lea 0x0(%edi,%eiz,1),%edi
49b: e8 fc ff ff ff call 49c <_ZL12unifiedTimerv+0x1c>
4a0: 84 c0 test %al,%al
4a2: 74 1c je 4c0 <_ZL12unifiedTimerv+0x40>
4a4: 0f b6 05 2c 00 2e 10 movzbl 0x102e002c,%eax
4ab: 83 f0 01 xor $0x1,%eax
4ae: 84 c0 test %al,%al
4b0: 74 0e je 4c0 <_ZL12unifiedTimerv+0x40>
4b2: b8 01 00 00 00 mov $0x1,%eax
4b7: eb 27 jmp 4e0 <_ZL12unifiedTimerv+0x60>
4b9: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi
4c0: b8 00 00 00 00 mov $0x0,%eax
4c5: eb 19 jmp 4e0 <_ZL12unifiedTimerv+0x60>
4c7: 90 nop
4c8: 90 nop
4c9: 90 nop
4ca: 90 nop
4cb: 90 nop
Kiểm tra lệnh gọi tại 49b: nó là gì validator có thể không grok. Cái gì trên trái đất có thể làm cho trình biên dịch đưa ra một lệnh mà các cuộc gọi vào giữa chính nó? Có cách nào để giái quyết vấn đề này không? Tôi đã biên soạn với -g -O0 -fno-inline. Lỗi trình biên dịch?
Dù sao, tôi đang từ bỏ và chờ đợi một chuỗi công cụ tốt hơn. Bạn đã cung cấp câu trả lời tuyệt vời. Cảm ơn! – user1095108