Mercurial > hg > nginx
view auto/cc/owc @ 9309:92e14ce71b72
Configure: adjusted optimization level for Sun C.
With "-fast" (and with "-xbuiltin=%all -xO4"), Sun C miscompiles
ngx_http_script_add_copy_code(), which is inlined into
ngx_http_script_compile(). From the assembly code it looks like
the code uses uninitialized register when calculating new p value
after memcpy:
movq %r15,%rdi
call _memcpy
leaq (%r15,rbx),%rax
movq (%r12),%rbx
movb $0x0000000000000000,(%rax)
Note that %rax is set to (%r15 + %rbx), but %rbx is only set after
it is used. As such, "*p = '\0'" tries to modify an unrelated memory
address, leading to a segmentation fault.
The issue was seen in tests which use null-terminated complex values:
proxy_ssl_certificate_vars.t, uwsgi_ssl_certificate_vars.t,
stream_proxy_ssl_certificate_vars.t. Tested with Sun C compilers
from Sun Studio 12.3, 12.4, 12.5, and 12.6.
Restructuring code, such as splitting ngx_cpymem() with a separate
"p += value->len" increment, fixes things, but it is not clear if its
the only place where such miscompilation can happen.
Fix is to use "-fast -xO3". Since IPO requires "-xO5", it is commented
out.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 07 Aug 2024 03:56:23 +0300 |
parents | b7b7f3a0cc28 |
children |
line wrap: on
line source
# Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. # Open Watcom C 1.0, 1.2, 1.3 # optimizations # maximize speed CFLAGS="$CFLAGS -ot" # reorder instructions for best pipeline usage CFLAGS="$CFLAGS -op" # inline intrinsic functions CFLAGS="$CFLAGS -oi" # inline expansion CFLAGS="$CFLAGS -oe" # disable stack checking calls CFLAGS="$CFLAGS -s" case $CPU in pentium) # optimize for Pentium and Athlon # register-based arguments passing conventions CPU_OPT="-5r" # stack-based arguments passing conventions #CPU_OPT="-5s" ;; pentiumpro) # optimize for Pentium Pro, Pentium II and Pentium III # register-based arguments passing conventions CPU_OPT="-6r" # stack-based arguments passing conventions #CPU_OPT="-6s" ;; esac CFLAGS="$CFLAGS $CPU_OPT" # warnings # maximum level CFLAGS="$CFLAGS -wx" #CFLAGS="$CFLAGS -w3" # stop on warning CFLAGS="$CFLAGS -we" # built target is NT CFLAGS="$CFLAGS -bt=nt" # multithreaded CFLAGS="$CFLAGS -bm" # debug CFLAGS="$CFLAGS -d2" # quiet CFLAGS="$CFLAGS -zq" # Open Watcom C 1.2 have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have # the precompiled headers #CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch" #NGX_PCH="$NGX_OBJS/ngx_config.pch" #NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch" #NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch" # the link flags, built target is NT GUI mode application #CORE_LINK="$CORE_LINK -l=nt_win" # the resource file NGX_RCC="wrc \$(CORE_INCS) -fo=$NGX_OBJS/nginx.res " NGX_RCC="$NGX_RCC $NGX_WIN32_RC $NGX_OBJS/nginx.exe" ngx_include_opt="-i=" ngx_objout="-fo" ngx_binout="-fe=" ngx_objext="obj" ngx_regex_dirsep='\\' ngx_dirsep="\\" ngx_long_start=' ' ngx_long_end=' ' ngx_long_regex_cont=' \&\ ' ngx_long_cont=' & ' ngx_regex_cont=' \&\ ' ngx_cont=' & ' ngx_tab=' & '