gpt4 book ai didi

pointers - 这种使用字符串指针安全吗?

转载 作者:行者123 更新时间:2023-12-05 00:58:04 26 4
gpt4 key购买 nike

在实现字符串实用程序函数时,我遇到了几个我认为可能不安全的字符指针表达式。我用谷歌搜索,在 SO 上搜索,阅读我的 Fortran 95 语言指南(Gehrke 1996)以及谷歌书籍中展示的各种摘录。但是,我找不到任何讨论这种特殊用法的来源。

ifort 和 gfortran 编译以下程序时没有警告:

PROGRAM test_pointer
IMPLICIT NONE
CHARACTER(LEN=100), TARGET :: string = "A string variable"
CHARACTER(LEN=0), TARGET :: empty = ""
CHARACTER(LEN=:), POINTER :: ptr

ptr => NULL()
IF(ptr == "") PRINT *, 'Nullified pointer is equal to ""'

ptr => string(-2:-3)
IF(ptr == "") PRINT *, 'ptr equals "", but the (empty) sub string was out of bounds.'

ptr => empty(1:0)
IF(ptr == "") PRINT *, 'ptr equals "", it was not possible to specify subarray within bonds'
END PROGRAM

程序的输出是:
Nullified pointer is equal to ""
ptr equals "", but the (empty) sub string was out of bounds.
ptr equals "", it was not possible to specify subarray within bonds

显然,指针的评估对编译器有意义,结果就是您所期望的。有人可以解释为什么上面的代码没有导致至少一个段错误吗?标准真的允许越界子串吗?使用无效的字符指针怎么样?

编辑:阅读 Vladimir F 的回答后,我意识到我忘记激活运行时检查。无效的指针实际上确实会触发运行时错误。

最佳答案

为什么它们不会导致段错误?取消引用无效的指针不符合标准(在 C 术语中,它是未定义的行为)。该标准没有说明不合格的程序应该做什么。该标准只适用于符合它的程序!任何不符合标准的程序都可能发生!

我得到这个(sunf90):

 ******  FORTRAN RUN-TIME SYSTEM  ******
Attempting to use an unassociated POINTER 'PTR'
Location: line 8 column 6 of 'charptr.f90'
Aborted

并使用另一个编译器(ifort):
forrtl: severe (408): fort: (7): Attempt to use pointer PTR when it is not associated with a target

Image PC Routine Line Source
a.out 0000000000402EB8 Unknown Unknown Unknown
a.out 0000000000402DE6 Unknown Unknown Unknown
libc.so.6 00007FA0AE123A15 Unknown Unknown Unknown
a.out 0000000000402CD9 Unknown Unknown Unknown

对于另外两次访问,您没有访问任何内容,您正在创建一个长度为0的子字符串,不需要访问字符变量,结果只是一个空字符串。

具体来说,Fortran 标准 (F2008:6.4.1.3) 关于创建子字符串是这样说的:

Both the starting point and the ending point shall be within the range 1, 2, ..., n unless the starting point exceeds the ending point, in which case the substring has length zero.



出于这个原因,第一部分不符合标准,但其他部分符合标准。

关于pointers - 这种使用字符串指针安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com