_FORTIFY_SOURCE for std::vector
Florian Weimer
fweimer@redhat.com
Mon Jun 4 17:55:00 GMT 2012
On 06/01/2012 01:34 PM, Jakub Jelinek wrote:
> Have you looked at the assembly differences with this in?
It's not great.
Here's an example:
void
write(std::vector<float>& blob, unsigned n, float v1, float v2, float
v3, float v4)
{
blob[n] = v1;
blob[n + 1] = v2;
blob[n + 2] = v3;
blob[n + 3] = v4;
}
Without checks, it turns into:
movq (%rdi), %rax
movl %esi, %edx
movss %xmm0, (%rax,%rdx,4)
leal 1(%rsi), %edx
movss %xmm1, (%rax,%rdx,4)
leal 2(%rsi), %edx
movss %xmm2, (%rax,%rdx,4)
leal 3(%rsi), %edx
movss %xmm3, (%rax,%rdx,4)
ret
With checks, it's:
subq $8, %rsp
movq (%rdi), %rdx
movq 8(%rdi), %rax
movl %esi, %ecx
subq %rdx, %rax
sarq $2, %rax
cmpq %rax, %rcx
jae .L8
movss %xmm0, (%rdx,%rcx,4)
leal 1(%rsi), %ecx
cmpq %rax, %rcx
jae .L8
movss %xmm1, (%rdx,%rcx,4)
leal 2(%rsi), %ecx
cmpq %rax, %rcx
jae .L8
movss %xmm2, (%rdx,%rcx,4)
leal 3(%rsi), %ecx
cmpq %rax, %rcx
jae .L8
movss %xmm3, (%rdx,%rcx,4)
addq $8, %rsp
ret
.L8:
call __chk_fail
For char/signed char/unsigned char, it's even worse because there's an
additional pointer load per store (bringing up the total to two—the
compiler cannot see that the _M_start pointer cannot point into the
std::vector object).
I'm no longer sure that's acceptable overhead. We really don't want
programmers to switch off _FORTIFY_SOURCE because of its overhead.
I'm attaching the patch just in case. I'm not sure the test case
actually ran (if it did, it passed on first try, which would be unusual.)
--
Florian Weimer / Red Hat Product Security Team
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fortify-std-vector.patch
Type: text/x-patch
Size: 4390 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20120604/68148a5c/attachment.bin>
More information about the Libstdc++
mailing list