Bug 2148324

Summary: Got "Segmentation fault (core dumped)" when use %s to print first char of a string
Product: Red Hat Enterprise Linux 9 Reporter: Fine Fan <ffan>
Component: gccAssignee: Marek Polacek <mpolacek>
gcc sub component: system-version QA Contact: qe-baseos-tools-bugs
Status: CLOSED NOTABUG Docs Contact:
Severity: medium    
Priority: unspecified CC: ahajkova, fweimer, jakub, ohudlick, sipoyare
Version: 9.2   
Target Milestone: rc   
Target Release: ---   
Hardware: x86_64   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2022-11-25 08:17:19 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Fine Fan 2022-11-25 02:18:04 UTC
Description of problem:


Version-Release number of selected component (if applicable):
[root@el92-221124 c]# rpm -q gcc
gcc-11.3.1-2.1.el9.x86_64
[root@el92-221124 c]# rpm -q kernel
kernel-5.14.0-200.el9.x86_64
[root@el92-221124 c]# 


How reproducible:


Steps to Reproduce:
[root@el92-221124 c]# cat 18-3-String_s_first_char.c 
#include<stdio.h>


int main(){
    char greetings[] = "Hello World!";
    printf ("%s\n",greetings);

    printf ("%s\n",greetings[0]); // Here ,I should use %c


}
[root@el92-221124 c]# gcc -o 18-3-String_s_first_char 18-3-String_s_first_char.c 
[root@el92-221124 c]# ./18-3-String_s_first_char 
Hello World!
Segmentation fault (core dumped)
[root@el92-221124 c]# 


Actual results:
Segmentation fault (core dumped)

Expected results:
when call gcc -o 18-3-String_s_first_char 18-3-String_s_first_char.c 
Will get some error tips maybe?

Additional info:

Comment 1 Florian Weimer 2022-11-25 08:17:19 UTC
If you build with -Wall (enable most warnings), GCC does complain:

$ gcc -Wall 18-3-String_s_first_char.c 
18-3-String_s_first_char.c: In function ‘main’:
18-3-String_s_first_char.c:8:15: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
    8 |     printf ("%s\n",greetings[0]); // Here ,I should use %c
      |              ~^    ~~~~~~~~~~~~
      |               |             |
      |               char *        int
      |              %d

Address Sanitizer (-fsanitize=address) also catches the issue (but is not much more helpful than running the uninstrumented program under valgrind).

I'm not sure what else we can do here. This is just how C works, sorry.

Comment 2 Fine Fan 2022-11-28 07:05:11 UTC
Wow  Thanks.