| Deutsch English Français Italiano |
|
<vhpuod$3mlgf$2@paganini.bofh.team> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!feeds.phibee-telecom.net!2.eu.feeder.erje.net!feeder.erje.net!newsfeed.bofh.team!paganini.bofh.team!not-for-mail
From: antispam@fricas.org (Waldek Hebisch)
Newsgroups: comp.lang.c
Subject: Re: else ladders practice
Date: Fri, 22 Nov 2024 12:51:27 -0000 (UTC)
Organization: To protect and to server
Message-ID: <vhpuod$3mlgf$2@paganini.bofh.team>
References: <3deb64c5b0ee344acd9fbaea1002baf7302c1e8f@i2pn2.org> <vgdt36$2r682$2@paganini.bofh.team> <vge8un$1o57r$3@dont-email.me> <vgpi5h$6s5t$1@paganini.bofh.team> <vgtsli$1690f$1@dont-email.me> <vhgr1v$2ovnd$1@paganini.bofh.team> <vhic66$1thk0$1@dont-email.me> <vhins8$1vuvp$1@dont-email.me> <vhj7nc$2svjh$1@paganini.bofh.team> <vhje8l$2412p$1@dont-email.me> <vhl1up$5vdg$1@dont-email.me> <vhlg53$8lff$1@dont-email.me> <vhnasl$l8h5$1@dont-email.me> <vhnj3n$mk94$1@dont-email.me>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Injection-Date: Fri, 22 Nov 2024 12:51:27 -0000 (UTC)
Injection-Info: paganini.bofh.team; logging-data="3888655"; posting-host="WwiNTD3IIceGeoS5hCc4+A.user.paganini.bofh.team"; mail-complaints-to="usenet@bofh.team"; posting-account="9dIQLXBM7WM9KzA+yjdR4A";
User-Agent: tin/2.6.2-20221225 ("Pittyvaich") (Linux/6.1.0-9-amd64 (x86_64))
X-Notice: Filtered by postfilter v. 0.9.3
Bytes: 3020
Lines: 73
Bart <bc@freeuk.com> wrote:
>
> int main(void) {
> int a;
> int* p = 0;
> a = *p;
> }
>
> Here's what happens with my C compiler when told to interpret it:
>
> c:\cx>cc -i c
> Compiling c.c to c.(int)
> Error: Null ptr access
>
> Here's what happens with gcc:
>
> c:\cx>gcc c.c
> c:\cx>a
> <crashes>
>
> Is there some option to insert such a check with gcc? I've no idea; most
> people don't.
I would do
gcc -g c.c
gdb a.out
run
and gdb would show me place with bad access. Things like bound
checking array access or overflow checking makes a big difference.
Null pointer access is reliably detected by hardware so no big
deal. Say what you 'cc' will do with the following function:
int
foo(int n) {
int a[10];
int i;
int res = 0;
for(i = 0; i <= 10; i++) {
a[i] = n + i;
}
for(i = 0; i <= 10; i++) {
res += a[i];
}
res;
}
Here gcc at compile time says:
foo.c: In function ‘foo’:
foo.c:15:17: warning: iteration 10 invokes undefined behavior [-Waggressive-loop-optimizations]
15 | res += a[i];
| ~^~~
foo.c:14:18: note: within this loop
14 | for(i = 0; i <= 10; i++) {
| ~~^~~~~
Of course, there are also cases like
void
bar(int n, int a[n]) {
int i;
for(i = 0; i <= n; i++) {
a[i] = i;
}
}
which are really wrong, but IIUC C standard considers them OK.
Still, good compiler should have an option to flag them either
at compile time or at runtime.
--
Waldek Hebisch