My recollection is that CLP programs padded all character parameters out to 32 characters before passing them. The garbage problem would come up once the paramter was > 32 characters in OPM CL.
That's only true when passing values from the command line or from literals in a CL program. In that instance, you haven't declared a variable and you haven't told the system how long the parmeter is, etc. So the system has to figure it out -- it does so by following the "32 character rule".
When you explicitly declare a variable and pass it, the system doesn't have to guess at the size, it'll use the actual memory of your variable... so no "padding" or anything like that is done.
This has nothing to do with whether the program is ILE or OPM. Or even which language it's written in. It's done this way for all program calls on the iSeries. Please don't try to make it out to be something that changed when ILE CL was introduced -- because that's definitely *not* the case.