Both examples work fine for a800, a495, ... I'd check strlen() function's body in dump and it the same for a4000 and a800 for example:
a800:
sub_FFC04108 ; CODE XREF: sub_FFC01910+10
; sub_FFC01910+34...
CMP R0, #0
BXEQ LR
MOV R1, R0
loc_FFC04114 ; CODE XREF: sub_FFC04108+18
LDRB R2, [R1]
CMP R2, #0
ADDNE R1, R1, #1
BNE loc_FFC04114
SUB R0, R1, R0
BX LR
a4000:
sub_FF812E28 ; CODE XREF: sub_FF811934+10
; sub_FF811934+34 ...
CMP R0, #0
BXEQ LR
MOV R1, R0
loc_FF812E34 ; CODE XREF: sub_FF812E28+18
LDRB R2, [R1]
CMP R2, #0
ADDNE R1, R1, #1
BNE loc_FF812E34
SUB R0, R1, R0
BX LR
a800 uses DIGICIII and a4000, a810 use DIGIC4 - perhaps Canon changes some memory managment...