# Copyright 1998-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This file was written by Elena Zannoni (ezannoni@cygnus.com) # This file is part of the gdb testsuite # # tests for pointer arithmetic and pointer dereferencing # with integer type variables and pointers to integers # # # test running programs # set testfile "pointers" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { untested pointers.exp return -1 } if [get_compiler_info] { return -1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} # # set it up at a breakpoint so we can play with the variable values # if ![runto_main] then { perror "couldn't run to breakpoint" continue } gdb_test "next " "more_code.*;" "continuing after dummy()" # # let's see if gdb catches some illegal operations on pointers # # I must comment these out because strict type checking is not # supported in this version of GDB. I do not really know # what the expected gdb reply is. # #send_gdb "print v_int_pointer2 = &v_int_pointer\n" #gdb_expect { # -re ".*.*$gdb_prompt $" { # pass "illegal pointer assignment rejected" # } # -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } # timeout { fail "(timeout) illegal pointer assignment rejected" } # } #send_gdb "print v_unsigned_int_pointer = &v_int\n" #gdb_expect { # -re ".*.*$gdb_prompt $" { # pass "illegal pointer assignment rejected" # } # -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } # timeout { fail "(timeout) ilegal pointer assignment rejected" } # } #send_gdb "print v_unsigned_int_pointer == v_double_pointer\n" #gdb_expect { # -re ".*.*$gdb_prompt $" { # pass "illegal pointer operation (+) rejected" # } # -re ".*$gdb_prompt $" { fail "illegal pointer operation (+) rejected" } # timeout { fail "(timeout) illegal pointer operation (+) rejected" } # } #send_gdb "print v_unsigned_int_pointer * v_double_pointer\n" #gdb_expect { # -re ".*Argument to arithmetic operation not a number or boolean.*$gdb_prompt $" { # pass "illegal pointer operation (*) rejected" # } # -re ".*$gdb_prompt $" { fail "illegal pointer operation (*) rejected" } # timeout { fail "(timeout) illegal pointer operation (*) rejected" } # } #send_gdb "print v_unsigned_int_pointer = v_double_pointer\n" #gdb_expect { # -re ".*.*$gdb_prompt $" { # pass "ilegal pointer assignment rejected" # } # -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } # timeout { fail "(timeout) illegal pointer assignment rejected" } # } #send_gdb "print v_unsigned_int_pointer = v_unsigned_int\n" #gdb_expect { # -re ".*.*$gdb_prompt $" { # pass "illegal pointer assignment rejected" # } # -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } # timeout { fail "(timeout) illegal pointer assignment rejected" } # } gdb_test_no_output "set variable v_int_pointer=&v_int_array\[0\]" \ "set pointer to beginning of array" gdb_test_no_output "set variable v_int_pointer2=&v_int_array\[1\]" \ "set pointer to end of array" gdb_test "print *v_int_pointer" " = 6" "print object pointed to" gdb_test "print *v_int_pointer2" " = 18" "print object pointed to \#2" gdb_test "print v_int_pointer == v_int_pointer2" " = $false" \ "pointer1==pointer2" gdb_test "print v_int_pointer != v_int_pointer2" " = $true" \ "pointer1!=pointer2" gdb_test "print v_int_pointer <= v_int_pointer2" " = $true" \ "pointer1<=pointer2" gdb_test "print v_int_pointer >= v_int_pointer2" " = $false" \ "pointer1>=pointer2" gdb_test "print v_int_pointer < v_int_pointer2" " = $true" \ "pointer1 v_int_pointer2" " = $false" \ "pointer1>pointer2" gdb_test_no_output "set variable y = *v_int_pointer++" \ "set y = *v_int_pointer++" gdb_test "print y" " = 6" "pointer assignment" gdb_test "print *v_int_pointer" " = 18" "and post-increment" gdb_test_no_output "set variable y = *--v_int_pointer2" \ "set y = *--v_int_pointer2" gdb_test "print y" " = 6" "pointer assignment" gdb_test "print *v_int_pointer2" " = 6" "and pre-decrement" gdb_test_no_output "set variable y =v_int_pointer-v_int_pointer2" \ "set y =v_int_pointer-v_int_pointer2" gdb_test "print y" " = 1" "pointer1-pointer2" gdb_test_no_output "set variable v_int_pointer=v_int_array" \ "set v_int_pointer=v_int_array" gdb_test "print *v_int_pointer" " = 6" \ "print array element through pointer" gdb_test "print *(v_int_pointer+1)" " = 18" \ "print array element through pointer \#2" # test print elements of array through pointers gdb_test "print (*rptr)\[0\]" " = 0" \ "print array element through pointer \#3" gdb_test "print (*rptr)\[1\]" " = 1" \ "print array element through pointer \#4" gdb_test "print (*rptr)\[2\]" " = 2" \ "print array element through pointer \#5" gdb_test_no_output "set variable rptr = rptr+1" "increment rptr" gdb_test "print (*rptr)\[0\]" " = 3" \ "print array element through pointer \#6" gdb_test "print (*rptr)\[1\]" " = 4" \ "print array element through pointer \#7" gdb_test "print (*rptr)\[2\]" " = 5" \ "print array element through pointer \#8" gdb_test "print *( *(matrix+1) +2)" " = 5" \ "print array element w/ pointer arithmetic" gdb_test "print **ptr_to_ptr_to_float" " = 100" \ "print through ptr to ptr" # tests for pointers # with elementary type variables and pointers. # gdb_test "break marker1" ".*" "" gdb_test "cont" "Break.* marker1 \\(\\) at .*:$decimal.*" \ continue to marker1" gdb_test "up" "more_code.*" "up from marker1" gdb_test "print *pUC" " = 21 \'.025\'.*" "print value of *pUC" gdb_test "ptype pUC" "type = unsigned char \\*" "ptype pUC" gdb_test "print *pS" " = -14" "print value of *pS" gdb_test_multiple "ptype pS" "ptype pS" { -re "type = short \\*.*$gdb_prompt $" { pass "ptype pS" } -re "type = short int \\*.*$gdb_prompt $" { pass "ptype pS" } } gdb_test "print *pUS" " = 7" "print value of *pUS" gdb_test_multiple "ptype pUS" "ptype pUS" { -re "type = unsigned short \\*.*$gdb_prompt $" { pass "ptype pUS" } -re "type = short unsigned int \\*.*$gdb_prompt $" { pass "ptype pUS" } } gdb_test "print *pI" " = 102" "print value of *pI" gdb_test "ptype pI" "type = int \\*" "ptype pI" gdb_test "print *pUI" " = 1002" "print value of *pUI" gdb_test "ptype pUI" "type = unsigned int \\*" "ptype pUI" gdb_test "print *pL" " = -234" "print value of *pL" gdb_test_multiple "ptype pL" "ptype pL" { -re "type = long \\*.*$gdb_prompt $" { pass "ptype pL" } -re "type = long int \\*.*$gdb_prompt $" { pass "ptype pL" } } gdb_test "print *pUL" " = 234" "print value of *pUL" gdb_test_multiple "ptype pUL" "ptype pUL" { -re "type = unsigned long \\*.*$gdb_prompt $" { pass "ptype pUL" } -re "type = long unsigned int \\*.*$gdb_prompt $" { pass "ptype pUL" } } gdb_test "print *pF" " = 1.2\[0-9\]*e\\+0?10" "print value of *pF" gdb_test "ptype pF" "type = float \\*" "ptype pF" gdb_test "print *pD" " = -1.2\[0-9\]*e\\-0?37" "print value of *pD" gdb_test "ptype pD" "type = double \\*" "ptype pD" gdb_test "print ******ppppppC" " = 65 \'A\'" \ "print value of ******ppppppC" gdb_test "ptype pC" "type = char \\*" "ptype pC" gdb_test "ptype ppC" "type = char \\*\\*" "ptype ppC" gdb_test "ptype pppC" "type = char \\*\\*\\*" "ptype pppC" gdb_test "ptype ppppC" "type = char \\*\\*\\*\\*" "ptype ppppC" gdb_test "ptype pppppC" "type = char \\*\\*\\*\\*\\*" "ptype pppppC" gdb_test "ptype ppppppC" "type = char \\*\\*\\*\\*\\*\\*" "ptype ppppppC" # Regression test for a crash. gdb_test "p instance.array_variable + 0" \ " = \\(long (int )?\\*\\) 0x\[0-9a-f\]* "