[Toybox] Towards find cleanup

Rob Landley rob at landley.net
Wed Apr 10 17:34:40 PDT 2013


On 04/10/2013 12:41:35 PM, Felix Janda wrote:
> Hello,
> 
> attached is some cleanup of the find toy inspired by Rob's (very cool)
> mails on how he proceeds when cleaning up toys. (and Isaac's recent
> partial cleanup of xzcat)
> 
> The patch contains a commit message.

Very nice. :)

Applied. Thank you.

> The cleanup was mainly mechanical and I still don't understand the toy
> well. (Before and after the cleanup) there seems to be a problem with
> the rule parsing/interpretation. For example
> 
> find . \( -type f -type f \) -o -type d
> 
> does not print directories.

Yup, it's an incomplete implementation. On the todo list. :)

> The toy also does not follow the whitespace conventions in toybox.  
> But I
> think that someone has scripts lying around to fix that.
> 
> I think that some function parameters should be made const and that
> the code could be made less repetitive.

I specify "static" because it allows the compiler to produce better  
code, but I've never found "const" to actually produce better code. The  
compiler's optimizer does liveness analysis, it can tell when you don't  
actually change a value after it's assigned to. In theory const lets  
the compiler do some of this across translation units, but that's what  
link time optimization is for these days.

In addition, const's syntax is unfortunately subtle when pointers are  
involved. Is the pointer what's const, is what it points to that's  
const (it binds left except at the left edge...), how about a pointer  
to a pointer, or pointer to an array...

I also haven't seen it interface well with the actual read-only  
sections ELF can produce. There's an -mebedded-data compiler flag that  
says to put data in the .rodata section. The main use of .rodata is to  
strings constants in there by default. Yet those strings aren't  
"const", you can assign a string constant to a regular char * without  
the compiler ever complaining. (And not being able to do so would  
pretty fundamentally break C.)

What const really seems like to me is a leakage from C++'s "public,  
private, protected" into C. It's a language facility that assumes  
programmers can't trust themselves or their successors to get it right.

So I tend to remove "const" from the code when I can. It doesn't  
justify its existence: if we're not supposed to modify the value from  
here, then don't do it. I trust the programmer to not suck, and I trust  
reviewers to catch it when they screw up.

Rob


More information about the Toybox mailing list