[Bro-Dev] #327: Binding attributes to values/variables

Bro Tracker bro at tracker.icir.org
Mon Nov 29 08:32:49 PST 2010


#327: Binding attributes to values/variables
------------------------+---------------------
 Reporter:  robin       |       Type:  Problem
   Status:  new         |   Priority:  Normal
Milestone:  Bro1.7      |  Component:  Bro
  Version:  git/master  |
------------------------+---------------------
 From Vern:

     In abstract terms, we need to marry two notions: per-variable
     attributes (those introduced when defining the variable) and
     per-value attributes (those introduced when creating a value).
     These both exist under-the-hood, but the rules for propagating
     them are ad hoc.

 I'm attaching the follow-up email thread with further thoughts on
 streamlining this.

 Robin

 [attachment:"None"]

 Did we ever reach resolution regarding the appended thread (from, um,
 a year ago!), or at least put something in the Tracker so we don't lose
 sight of it?

                 Vern

 [attachment:"None-1"]

 On Tue, Nov 03, 2009 at 17:25 -0800, you wrote:

 > In abstract terms, we need to marry two notions: per-variable attributes
 > (those introduced when defining the variable) and per-value attributes
 > (those introduced when creating a value).  These both exist under-the-
 hood,
 > but the rules for propagating them are ad hoc.

 This is something I've wondered about a few times already what the
 right thing to do is. The keyword at the moment is indeed "ad-hoc":
 I remember that a number of times I've been running into problems
 with propagating (or not propagating) attributes, and while I was
 always able to fix the immediate problem in some way, we don't have
 a clear system at the moment when that happens and when not.

 That said, I'm not really sure that this should ideally look like.
 Intuitively, I'd actually say attributes belong to values, not
 variables, because transfer-on-assignment can lead to subtle effects
 (values are passed around, and what if the receiving function
 happens to assign the value to the wrong variable?. Also what if you
 assign a value with attribute X to a variable without X; shouldn't
 the value then be *deleted* for consistency reasons?).

 If we accept for a moment that attributes belong only to values,
 then we can think about how to set them. A global definition such as

       const log_file = open_log_file("foo") &rotate_interval

 can be interpreted as assigning the attribute to the value returned
 from the function (more generaly to whatever what the assigned
 expression yields).

 We can use the "add foo &raw_output" syntax you suggested for adding
 attributes to the value of foo dynamically.

 A declaration such as

       const foo = F &redef;

 can be interpreted as "we can rebind foo if it's current value has
 the &redef attribute".

 I haven't thought this through actually but I guess my question is
 whether we need per-variable attributes at all?

 Robin

 [attachment:"None-2"]

 On Nov 4, 2009, at 7:54 PM, Robin Sommer wrote:

 >That said, I'm not really sure that this should ideally look like.
 >Intuitively, I'd actually say attributes belong to values, not
 >variables, because transfer-on-assignment can lead to subtle effects
 >(values are passed around, and what if the receiving function
 >happens to assign the value to the wrong variable?. Also what if you
 >assign a value with attribute X to a variable without X; shouldn't
 >the value then be *deleted* for consistency reasons?).

 Attributes being attached to value really seems to make sense.

 >If we accept for a moment that attributes belong only to values,
 >then we can think about how to set them. A global definition such as
 >
 >     const log_file = open_log_file("foo") &rotate_interval

 It works in this case, but this has typically been where trouble was
 encountered.  What about cases where there isn't a value assigned yet?
 Something like...

 const bad_addrs_with_description: table[addr] of string &redef
 &write_expire=10mins;

 There isn't a value yet, but it has an attribute applied to it.  Would
 that style still be supported?  It would seem to conflict with having only
 value attributes.

 Even for my database backed variable stuff I'm working on, it created a
 stumbling block.  What I'm doing internally is creating a copy of the
 value including attributes to a separate internal value when a query is
 being run.  That value is then filled from the database and the script
 level variable is rebound to my newly filled internal value and the old
 value is deleted.  I think that would be the right way to do it in this
 case even if only value attributes exist because it's an internal detail
 and the new value is being created internally, but it's certainly
 confusing sometimes.

   .Seth

 [attachment:"None-3"]

 On Wed, Nov 04, 2009 at 20:26 -0500, you wrote:

 > const bad_addrs_with_description: table[addr] of string &redef
 > &write_expire=10mins;
 >
 > There isn't a value yet, but it has an attribute applied to it.

 Actually there is: it's assigned an empty table. So, yes that would
 still work.

 What would be different however is a later assignment (redef for
 const [1]), which would ignore the &write_expire of the original
 definition and instead use the attributes from the assigned value.

 Robin

 [1] A "=" redef, not a "+=" redef which works on the original value.

 [attachment:"None-4"]

 On Nov 10, 2009, at 12:32 AM, Robin Sommer wrote:

 >What would be different however is a later assignment (redef for
 >const [1]), which would ignore the &write_expire of the original
 >definition and instead use the attributes from the assigned value.
 >
 >[1] A "=" redef, not a "+=" redef which works on the original value.


 Ah, ok.  This is all coming together for me now. :)

 Another question I have is if the change was made to allow attribute
 additions and deletions at runtime, does it sort of violate the concept of
 const?  const seems to tie together the value and variable together and
 make them unchangeable at runtime but it's a little confusing conceptually
 if you're able to still change the attributes of a const at runtime.

 Am I thinking about that right?

   .Seth

 [attachment:"None-5"]

 On Fri, Nov 13, 2009 at 13:24 -0500, you wrote:

 > Another question I have is if the change was made to allow attribute
 > additions and deletions at runtime, does it sort of violate the concept
 > of const?

 That's a good point, yes. Perhaps "const foo = xxx" should actually
 mean that the value xxx gets an (internal) attribute &const so that
 it's not changeable? And then assigning to a global with a current
 value that has the &const attribute would be prohibited as well.
 Does that make sense?

 Robin

-- 
Ticket URL: <http://tracker.icir.org/bro/ticket/327>
Bro Tracker <http://tracker.icir.org/bro>
Bro Issue Tracker




More information about the bro-dev mailing list