1
0
mirror of https://github.com/golang/go synced 2024-11-21 21:44:40 -07:00

gc: better error for non-calling use of unsafe builtins.

Fixes #1951

R=rsc
CC=golang-dev
https://golang.org/cl/5372041
This commit is contained in:
Luuk van Dijk 2011-11-09 18:30:54 +01:00
parent 21f5057639
commit 924ea515cf
4 changed files with 33 additions and 2 deletions

View File

@ -1247,6 +1247,7 @@ void queuemethod(Node *n);
/*
* unsafe.c
*/
int isunsafebuiltin(Node *n);
Node* unsafenmagic(Node *n);
/*

View File

@ -210,6 +210,10 @@ reswitch:
}
n->used = 1;
}
if(!(top &Ecall) && isunsafebuiltin(n)) {
yyerror("%N is not an expression, must be called", n);
goto error;
}
ok |= Erv;
goto ret;

View File

@ -10,6 +10,7 @@
* look for
* unsafe.Sizeof
* unsafe.Offsetof
* unsafe.Alignof
* rewrite with a constant
*/
Node*
@ -22,7 +23,7 @@ unsafenmagic(Node *nn)
Val val;
Node *fn;
NodeList *args;
fn = nn->left;
args = nn->list;
@ -83,7 +84,7 @@ bad:
yyerror("invalid expression %N", nn);
v = 0;
goto ret;
yes:
if(args->next != nil)
yyerror("extra arguments for %S", s);
@ -97,3 +98,17 @@ ret:
n->type = types[TUINTPTR];
return n;
}
int
isunsafebuiltin(Node *n)
{
if(n == N || n->op != ONAME || n->sym == S || n->sym->pkg != unsafepkg)
return 0;
if(strcmp(n->sym->name, "Sizeof") == 0)
return 1;
if(strcmp(n->sym->name, "Offsetof") == 0)
return 1;
if(strcmp(n->sym->name, "Alignof") == 0)
return 1;
return 0;
}

11
test/fixedbugs/bug376.go Normal file
View File

@ -0,0 +1,11 @@
// errchk $G $D/$F.go
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// issue 1951
package foo
import "unsafe"
var v = unsafe.Sizeof // ERROR "must be called"